J'ai le code suivant dans Python 3, qui est destiné à imprimer chaque ligne dans un fichier csv.
import csv
with open('my_file.csv', 'r', newline='') as csvfile:
lines = csv.reader(csvfile, delimiter = ',', quotechar = '|')
for line in lines:
print(' '.join(line))
Mais quand je l'exécute, cela me donne cette erreur:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
J'ai parcouru le fichier csv, et il s'avère que si je retire un seul ñ (petit n avec un tilde en haut), chaque ligne s'imprime correctement.
Mon problème est que j'ai examiné un tas de solutions différentes à des problèmes similaires, mais je ne sais toujours pas comment résoudre ce problème, quoi décoder/encoder, etc. .
Nous savons que le fichier contient l'octet b'\x96'
car il est mentionné dans le message d'erreur:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
Maintenant, nous pouvons écrire un petit script pour savoir s'il y a des encodages où b'\x96'
décode en ñ
:
import pkgutil
import encodings
import os
def all_encodings():
modnames = set([modname for importer, modname, ispkg in pkgutil.walk_packages(
path=[os.path.dirname(encodings.__file__)], prefix='')])
aliases = set(encodings.aliases.aliases.values())
return modnames.union(aliases)
text = b'\x96'
for enc in all_encodings():
try:
msg = text.decode(enc)
except Exception:
continue
if msg == 'ñ':
print('Decoding {t} with {enc} is {m}'.format(t=text, enc=enc, m=msg))
qui donne
Decoding b'\x96' with mac_roman is ñ
Decoding b'\x96' with mac_farsi is ñ
Decoding b'\x96' with mac_croatian is ñ
Decoding b'\x96' with mac_arabic is ñ
Decoding b'\x96' with mac_romanian is ñ
Decoding b'\x96' with mac_iceland is ñ
Decoding b'\x96' with mac_turkish is ñ
Par conséquent, essayez de changer
with open('my_file.csv', 'r', newline='') as csvfile:
à l'un de ces encodages, tels que:
with open('my_file.csv', 'r', encoding='mac_roman', newline='') as csvfile:
with open('my_file.csv', 'r', newline='', encoding='ISO-8859-1') as csvfile:
le caractère n'est pas répertorié sur l'encodage UTC-8. Pour résoudre ce problème, vous pouvez utiliser le codage ISO-8859-1 à la place. Pour plus de détails sur cet encodage, vous pouvez vous référer au lien ci-dessous: https://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html
Pour ceux qui ont rencontré la même erreur que celle indiquée dans le sujet, faites attention à l'encodage de fichier de votre fichier csv. Il est possible que ce ne soit pas utf-8. Je viens de remarquer que LibreOffice a créé un fichier encodé en utf-16 pour moi aujourd'hui sans me le demander, même si je n'ai pas pu le reproduire.
Si vous essayez d'ouvrir un document encodé en utf-16 à l'aide de open(... encoding='utf-8')
, vous obtiendrez l'erreur:
UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0xff en position 0: octet de début invalide
Pour corriger, spécifiez le codage "utf-16" ou modifiez le codage du csv.
J'ai également rencontré le problème avec python 3 et mon problème a été résolu en utilisant le type de codage tf-16
with open('data.csv', newline='',encoding='utf-16') as csvfile: