UnicodeDecodeError lors de la lecture D'un fichier CSV dans Pandas avec Python
j'exécute un programme qui traite 30 000 fichiers similaires. Un nombre aléatoire d'entre eux s'arrêtent et produisent cette erreur...
File "C:Importersrcdfmanimporter.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:Python33libsite-packagespandasioparsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:Python33libsite-packagespandasioparsers.py", line 205, in _read
return parser.read()
File "C:Python33libsite-packagespandasioparsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:Python33libsite-packagespandasioparsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandasparser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandasparser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandasparser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandasparser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandasparser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandasparser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandasparser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandasparser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
la source/création de ces fichiers vient Toutes du même endroit. Quelle est la meilleure façon de corriger cela pour procéder à l'importation?
4 réponses
read_csv
prend une option encoding
pour traiter des fichiers dans des formats différents. J'utilise principalement read_csv('file', encoding = "ISO-8859-1")
, ou alternativement encoding = "utf-8"
pour la lecture, et généralement utf-8
pour to_csv
.
vous pouvez également utiliser le alias 'latin1'
au lieu de 'ISO-8859-1'
.
voir documentation Pandas pertinente , exemples de python docs sur les fichiers csv , et beaucoup de questions connexes, ici sur.
la plus simple de toutes les Solutions:
- ouvrir le fichier csv dans Sublime text editor .
- Enregistrer le fichier au format utf-8.
dans sublime, cliquer Fichier - > Enregistrer avec encodage - > UTF-8
alors, vous pouvez lire votre fichier comme d'habitude:
import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')
EDIT 1:
S'il y a beaucoup de fichiers, alors vous pouvez sauter l'étape sublime.
vient de lire le fichier en utilisant
data = pd.read_csv('file_name.csv', encoding='utf-8')
et les autres types d'encodage sont:
encoding = "cp1252"
encoding = "ISO-8859-1"
Pandas permet de spécifier l'encodage, mais ne permet pas d'ignorer les erreurs pour ne pas remplacer automatiquement les octets offensants. Il n'y a donc pas de méthode pour toutes les tailles , mais des méthodes différentes selon le cas d'utilisation réel.
-
vous connaissez l'encodage, et il n'y a pas d'erreur d'encodage dans le fichier. Great: vous avez juste à spécifier l'encodage:
file_encoding = 'cp1252' # set file_encoding to the file encoding (utf8, latin1, etc.) pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
-
Vous Je ne veux pas être ennuyé avec des questions d'encodage, et je veux seulement que ce fichu fichier se charge, peu importe si certains champs de texte contiennent des ordures. Ok, vous n'avez qu'à utiliser l'encodage
Latin1
car il accepte n'importe quel octet possible comme entrée (et le convertir au caractère unicode du même code):pd.read_csv(input_file_and_path, ..., encoding='latin1')
-
vous savez que la plus grande partie du fichier est écrite avec un encodage spécifique, mais il contient également des erreurs d'encodage. Un exemple du monde réel est un fichier UTF8 qui a été édité avec un éditeur non utf8 et qui contient quelques lignes avec un encodage différent. Pandas n'a aucune disposition pour un traitement d'erreur spécial, mais la fonction
open
de Python a (en supposant que Python3), etread_csv
accepte un fichier comme objet. Les paramètres d'erreurs typiques à utiliser ici sont'ignore'
qui supprime simplement les octets offensants ou (IMHO better)'backslashreplace'
qui remplace les octets offensants par la séquence d'échappement rétro-slashée de leur Python:file_encoding = 'utf8' # set file_encoding to the file encoding (utf8, latin1, etc.) input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace') pd.read_csv(input_fd, ...)
a lutté avec cela un certain temps et j'ai pensé que je posterais sur cette question comme il est le premier résultat de recherche. L'ajout de la balise encoding='iso-8859-1" à pandas read_csv n'a pas fonctionné, et aucun autre encodage n'a continué à donner une Ecodeerror Unicoded.
si vous passez une poignée de fichier à la pd.read_csv(), vous devez mettre l'encodage= attribut sur le fichier ouvert, pas dans read_csv. C'est évident avec le recul, mais une erreur subtile à retrouver.