web-dev-qa-db-fra.com

Python 3 fichier CSV donnant UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'erreur d'octet lorsque j'imprime

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. .

22
HLH

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:
47
unutbu

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

15
Sir Markpo

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.

5
Timothy C. Quinn

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:
0
Sheshan Gamage