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?

167
demandé sur Stefan 2013-08-11 16:06:25

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.

400
répondu Stefan 2018-05-31 22:21:39

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"
14
répondu Gil Baggio 2018-08-09 04:49:10

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.

  1. 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)
    
  2. 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')
    
  3. 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), et read_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, ...)
    
3
répondu Serge Ballesta 2018-08-09 09:42:15

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.

1
répondu J. Ternent 2018-05-13 17:12:35