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:\Importer\src\dfman\importer.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
return parser.read()
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
La source / création de ces fichiers proviennent tous du même endroit. Quelle est la meilleure façon de corriger cela pour procéder à l'importation?
cp1252
peut être préférable de le faireiso-8859-1
.pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')
travaillé pour moiANSI
. Pour le comprendre, j'ai ouvert le csvnotepad
puis cliquezsave as
, là, il montre l'encodage à côté du bouton Enregistrer.La solution la plus simple de toutes:
Solution alternative:
Ensuite, vous pouvez lire votre fichier comme d'habitude:
et les autres types de codage différents sont:
la source
encoding='iso-8859-1'
, à la place,engine='python'
jette_csv.Error: field larger than field limit (131072)
.Pandas permet de spécifier le codage, mais ne permet pas d'ignorer les erreurs pour ne pas remplacer automatiquement les octets incriminés. Il n'y a donc pas de méthode unique , mais des méthodes différentes selon le cas d'utilisation réel.
Vous connaissez l'encodage et il n'y a aucune erreur d'encodage dans le fichier. Génial: il suffit de spécifier l'encodage:
Vous ne voulez pas être gêné par des questions d'encodage, et ne voulez que ce fichu fichier à charger, peu importe si certains champs de texte contiennent des ordures. Ok, vous n'avez qu'à utiliser l'
Latin1
encodage car il accepte tout octet possible en entrée (et le convertit en caractère unicode du même code):Vous savez que la plupart du fichier est écrit avec un codage spécifique, mais il contient également des erreurs de codage. Un exemple réel est un fichier UTF8 qui a été édité avec un éditeur non utf8 et qui contient des lignes avec un encodage différent. Pandas n'a aucune disposition pour un traitement d'erreur spécial, mais la
open
fonction Python a (en supposant Python3), etread_csv
accepte un objet de type fichier. Le paramètre d'erreurs typique à utiliser ici est celui'ignore'
qui supprime simplement les octets incriminés ou (à mon humble avis)'backslashreplace'
qui remplace les octets incriminés par la séquence d'échappement antislashée de leur Python:la source
après avoir exécuté ce code, vous trouverez l'encodage de 'filename.csv' puis exécutez le code comme suit
Voilà
la source
Dans mon cas, un fichier a un
USC-2 LE BOM
encodage, selon Notepad ++. C'estencoding="utf_16_le"
pour python.J'espère que cela aide à trouver une réponse un peu plus rapidement pour quelqu'un.
la source
Dans mon cas, cela a fonctionné pour python 2.7:
Et pour python 3, seulement:
la source
Essayez de spécifier le moteur = 'python'. Cela a fonctionné pour moi, mais j'essaie toujours de comprendre pourquoi.
la source
Je publie une réponse pour fournir une solution mise à jour et une explication de la raison pour laquelle ce problème peut se produire. Supposons que vous obtenez ces données à partir d'une base de données ou d'un classeur Excel. Si vous avez des caractères spéciaux comme
La Cañada Flintridge city
, eh bien, sauf si vous exportez les données en utilisant l'UTF-8
encodage, vous allez introduire des erreurs.La Cañada Flintridge city
deviendraLa Ca\xf1ada Flintridge city
. Si vous utilisezpandas.read_csv
sans aucun ajustement des paramètres par défaut, vous rencontrerez l'erreur suivanteHeureusement, il existe quelques solutions.
Option 1 , corrigez l'exportation. Assurez-vous d'utiliser l'
UTF-8
encodage.Option 2 , si la résolution du problème d' exportation ne sont pas disponibles pour vous, et vous devez utiliser
pandas.read_csv
, assurez - vous d'inclure les paramters suivants,engine='python'
. Par défaut, pandas utiliseengine='C'
ce qui est idéal pour lire de gros fichiers propres, mais plantera si quelque chose d'inattendu se produit. D'après mon expérience, le réglageencoding='utf-8'
n'a jamais résolu ce problèmeUnicodeDecodeError
. En outre, vous n'avez pas besoin d'utilisererrors_bad_lines
, cependant, c'est toujours une option si vous en avez vraiment besoin.Option 3: la solution est ma solution préférée personnellement. Lisez le fichier en utilisant vanilla Python.
J'espère que cela aidera les personnes rencontrant ce problème pour la première fois.
la source
Je me suis débattu avec cela un moment et j'ai pensé que je posterais sur cette question car c'est le premier résultat de recherche. L'ajout de la
encoding="iso-8859-1"
balise aux pandasread_csv
n'a pas fonctionné, ni aucun autre encodage, a continué à donner un UnicodeDecodeError.Si vous passez un descripteur de fichier à
pd.read_csv(),
vous devez mettre l'encoding
attribut sur le fichier ouvert, pas dansread_csv
. Rétrospectivement évident, mais une erreur subtile à retrouver.la source
Veuillez essayer d'ajouter
CA aidera. A travaillé pour moi. Assurez-vous également d'utiliser les noms de délimiteur et de colonne corrects.
Vous pouvez commencer par charger seulement 1 000 lignes pour charger rapidement le fichier.
la source
Cette réponse semble être le fourre-tout pour les problèmes d'encodage CSV. Si vous rencontrez un problème de codage étrange avec votre en-tête comme ceci:
Ensuite, vous avez un caractère de marque d'ordre des octets (BOM) au début de votre fichier CSV. Cette réponse résout le problème:
Python read csv - BOM incorporé dans la première clé
La solution est de charger le CSV avec
encoding="utf-8-sig"
:J'espère que cela aide quelqu'un.
la source
Je poste une mise à jour de cet ancien fil. J'ai trouvé une solution qui a fonctionné, mais nécessite l'ouverture de chaque fichier. J'ai ouvert mon fichier csv dans LibreOffice, choisi Enregistrer sous> modifier les paramètres du filtre. Dans le menu déroulant, j'ai choisi l'encodage UTF8. Ensuite, j'ai ajouté
encoding="utf-8-sig"
audata = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
.J'espère que cela aide quelqu'un.
la source
J'ai du mal à ouvrir un fichier CSV en chinois simplifié téléchargé depuis une banque en ligne, j'ai essayé
latin1
, j'ai essayéiso-8859-1
, j'ai essayécp1252
, tout cela en vain.Mais fait
pd.read_csv("",encoding ='gbk')
simplement le travail.la source
J'utilise Jupyter-notebook. Et dans mon cas, il montrait le fichier dans le mauvais format. L'option «encodage» ne fonctionnait pas. Je sauvegarde donc le csv au format utf-8, et ça marche.
la source
Essaye ça:
On dirait qu'il va prendre soin de l'encodage sans l'exprimer explicitement par argument
la source
Vérifiez l'encodage avant de passer aux pandas. Cela vous ralentira, mais ...
En python 3.7
la source
Un autre problème important que j'ai rencontré et qui a entraîné la même erreur était:
la source
read_excel
pandas.Vous pouvez essayer ça.
la source