J'essaie de lire un fichier CSV avec des caractères accentués avec Python (uniquement des caractères français et / ou espagnols). Basé sur la documentation Python 2.5 pour le csvreader ( http://docs.python.org/library/csv.html ), j'ai proposé le code suivant pour lire le fichier CSV car le csvreader ne prend en charge que l'ASCII.
def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
dialect=dialect, **kwargs)
for row in csv_reader:
# decode UTF-8 back to Unicode, cell by cell:
yield [unicode(cell, 'utf-8') for cell in row]
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
filename = 'output.csv'
reader = unicode_csv_reader(open(filename))
try:
products = []
for field1, field2, field3 in reader:
...
Voici un extrait du fichier CSV que j'essaie de lire:
0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert
...
Même si j'essaie d'encoder / décoder en UTF-8, j'obtiens toujours l'exception suivante:
Traceback (most recent call last):
File ".\Test.py", line 53, in <module>
for field1, field2, field3 in reader:
File ".\Test.py", line 40, in unicode_csv_reader
for row in csv_reader:
File ".\Test.py", line 46, in utf_8_encoder
yield line.encode('utf-8', 'ignore')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 68: ordinal not in range(128)
Comment puis-je réparer ça?
python
utf-8
csv
character-encoding
Martin
la source
la source
Réponses:
La
.encode
méthode est appliquée à une chaîne Unicode pour créer une chaîne d'octets; mais vous l'appelez plutôt sur une chaîne d'octets ... dans le mauvais sens! Regardez lecodecs
module dans la bibliothèque standard etcodecs.open
en particulier pour de meilleures solutions générales pour la lecture de fichiers texte encodés en UTF-8. Cependant, pour lecsv
module en particulier, vous devez transmettre des données utf-8, et c'est ce que vous obtenez déjà, votre code peut donc être beaucoup plus simple:PS: s'il s'avère que vos données d'entrée ne sont PAS dans utf-8, mais par exemple dans ISO-8859-1, alors vous avez besoin d'un "transcodage" (si vous souhaitez utiliser utf-8 au
csv
niveau du module) , de la formeline.decode('whateverweirdcodec').encode('utf-8')
- mais vous pouvez probablement simplement utiliser le nom de votre encodage existant dans layield
ligne de mon code ci-dessus, au lieu de'utf-8'
, comme celacsv
va en fait être très bien avec les bytestrings encodés ISO-8859- *.la source
Python 2.X
Il existe une bibliothèque unicode-csv qui devrait résoudre vos problèmes, avec l'avantage supplémentaire de ne pas naviguer pour écrire un nouveau code lié à csv.
Voici un exemple de leur readme:
Python 3.X
En python 3, cela est pris en charge par le
csv
module intégré. Voir cet exemple:la source
Si vous souhaitez lire un fichier CSV avec un encodage utf-8, une approche minimaliste que je vous recommande est d'utiliser quelque chose comme ceci:
Avec cette déclaration, vous pouvez utiliser plus tard un lecteur CSV pour travailler avec.
la source
encoding
enopen
open('file.csv', 'r', encoding="ISO8859")
Consultez également la réponse dans cet article: https://stackoverflow.com/a/9347871/1338557
Il suggère l'utilisation de la bibliothèque appelée ucsv.py. Remplacement court et simple pour CSV écrit pour résoudre le problème d'encodage (utf-8) pour Python 2.7. Fournit également un support pour csv.DictReader
Edit : Ajout d'un exemple de code que j'ai utilisé:
la source
Utiliser
codecs.open
comme Alex Martelli l'a suggéré s'est avéré utile pour moi.la source
csv
module mais ne l'utilisez pas.Le lien vers la page d'aide est le même pour python 2.6 et pour autant que je sache, il n'y a pas eu de changement dans le module csv depuis la version 2.5 (en plus des corrections de bogues). Voici le code qui fonctionne simplement sans aucun encodage / décodage (le fichier da.csv contient les mêmes données que les données variables ). Je suppose que votre fichier doit être lu correctement sans aucune conversion.
test.py:
da.csv:
la source
delimiter=','
au lieu dedialect=csv.excel
.Il convient de noter que si rien n'a fonctionné pour vous, vous avez peut-être oublié d'échapper à votre chemin.
Par exemple, ce code:
Entraînerait une erreur:
Pour réparer, faites simplement:
la source
En regardant la
Latin-1
table unicode , je vois le code de caractère00E9
" LATIN MINUSCULE LETTRE E AVEC ACUTE ". Il s'agit du caractère accentué de vos exemples de données. Un simple testPython
montre que leUTF-8
codage de ce caractère est différent duUTF-16
codage unicode (presque ).Je vous suggère d'essayer
encode("UTF-8")
les données unicode avant d'appeler le spécialunicode_csv_reader()
. La simple lecture des données d'un fichier peut masquer l'encodage, alors vérifiez les valeurs réelles des caractères.la source
A eu le même problème sur un autre serveur, mais s'est rendu compte que les paramètres régionaux sont perturbés.
résolu le problème
la source