J'utilise NLTK pour effectuer le regroupement en kméens de mon fichier texte dans lequel chaque ligne est considérée comme un document. Ainsi, par exemple, mon fichier texte ressemble à ceci:
appartient le coup mortel
précipité
mike murs précipités jericho
jägermeister règles
règles suivies par les groupes jägermeister
approche
Maintenant, le code de démonstration que je tente d’exécuter est le suivant: https://Gist.github.com/xim/1279283
L'erreur que je reçois est la suivante:
Traceback (most recent call last):
File "cluster_example.py", line 40, in
words = get_words(job_titles)
File "cluster_example.py", line 20, in get_words
words.add(normalize_Word(word))
File "", line 1, in
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize
result = func(*args)
File "cluster_example.py", line 14, in normalize_Word
return stemmer_func(Word.lower())
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/Snowball.py", line 694, in stem
Word = (Word.replace(u"\u2019", u"\x27")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128)
Que se passe-t-il ici?
Le fichier est lu comme un groupe de str
s, mais il devrait s'agir de unicode
s. Python tente de convertir implicitement, mais échoue. Changement:
job_titles = [line.strip() for line in title_file.readlines()]
pour décoder explicitement les str
s en unicode
(ici en supposant UTF-8):
job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()]
Vous pouvez également résoudre ce problème en important le module codecs
et en utilisant codecs.open
plutôt que le open
intégré.
Cela fonctionne bien pour moi.
f = open(file_path, 'r+', encoding="utf-8")
Vous pouvez ajouter un troisième paramètre encoding pour vous assurer que le type de codage est 'utf-8'
Remarque: cette méthode fonctionne bien en Python3, je ne l'ai pas essayée en Python2.7.
Vous pouvez aussi essayer ceci:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Pour moi, il y avait un problème avec le codage du terminal. Ajouter UTF-8 à .bashrc a résolu le problème:
export LC_CTYPE=en_US.UTF-8
N'oubliez pas de recharger .bashrc ensuite:
source ~/.bashrc
Pour rechercher toutes les erreurs Unicode liées à ... à l'aide de la commande suivante:
grep -r -P '[^\x00-\x7f]' /etc/Apache2 /etc/letsencrypt /etc/nginx
Trouvé le mien dans
/etc/letsencrypt/options-ssl-nginx.conf: # The following CSP directives don't use default-src as
En utilisant shed
, j'ai trouvé la séquence fautive. Il s’est avéré être une erreur de la part de l’éditeur .
00008099: C2 194 302 11000010
00008100: A0 160 240 10100000
00008101: d 64 100 144 01100100
00008102: e 65 101 145 01100101
00008103: f 66 102 146 01100110
00008104: a 61 097 141 01100001
00008105: u 75 117 165 01110101
00008106: l 6C 108 154 01101100
00008107: t 74 116 164 01110100
00008108: - 2D 045 055 00101101
00008109: s 73 115 163 01110011
00008110: r 72 114 162 01110010
00008111: c 63 099 143 01100011
00008112: C2 194 302 11000010
00008113: A0 160 240 10100000
Vous pouvez essayer ceci avant d'utiliser la chaîne job_titles
:
source = unicode(job_titles, 'utf-8')
Quand je suis sur Ubuntu 18.04 avec Python3.6 j’ai résolu le problème en faisant les deux:
with open(filename, encoding="utf-8") as lines:
et si vous utilisez l'outil en ligne de commande:
export LC_ALL=C.UTF-8
Notez que si vous êtes dans Python2.7 vous devez gérer cela différemment. Vous devez d’abord définir le codage par défaut:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
et pour charger le fichier, vous devez utiliser io.open
pour définir le codage:
import io
with io.open(filename, 'r', encoding='utf-8') as lines:
Vous avez encore besoin d'exporter env
export LC_ALL=C.UTF-8
python3x ou supérieur
charger le fichier dans le flux d'octets:
body = '' pour les lignes en open ('website/index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body
utiliser le paramètre global:
import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')
Pour Python 3, le codage par défaut serait "utf-8". Les étapes suivantes sont suggérées dans la documentation de base: https://docs.python.org/2/library/csv.html#csv-examples en cas de problème
Créer une fonction
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
Puis utilisez la fonction à l’intérieur du lecteur, par exemple.
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))
Il suffit de faire ce qui suit -------------------------
faire open(fn, 'rb').read().decode('utf-8')
au lieu de open(fn).read()