J'essaie d'utiliser des pandas pour manipuler un fichier .csv mais j'obtiens cette erreur:
pandas.parser.CParserError: Erreur lors de la tokenisation des données. Erreur C: 2 champs attendus sur la ligne 3, vu 12
J'ai essayé de lire la documentation des pandas, mais je n'ai rien trouvé.
Mon code est simple:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Comment puis-je résoudre ça? Dois-je utiliser lecsv
module ou une autre langue?
Le fichier provient de Morningstar
pandas.to_csv()
, cela POURRAIT être dû au fait qu'il y a un '\ r' dans les noms de colonnes, auquel cas to_csv () écrira en fait les noms de colonnes suivants dans la première colonne du bloc de données, provoquant une différence entre le nombre de colonnes dans les X premières lignes. Cette différence est l'une des causes de l'erreur C.pd.read_csv("<path>", sep=";")
. N'utilisez pas Excel pour vérifier car il place parfois les données dans des colonnes par défaut et supprime donc le séparateur.Réponses:
vous pouvez également essayer;
Notez que cela entraînera le saut des lignes incriminées.
la source
expected 8 fields, saw 9
?read_csv
. @PetraBarus, pourquoi ne pas simplement ajouter des colonnes aux fichiers CSV qui leur manquent (avec des valeurs nulles au besoin)?names=["col1", "col2", ...]
du nombre maximal de colonnes attendues fonctionne également, et c'est ainsi que j'ai résolu ce problème lorsque je l'ai rencontré. Voir: stackoverflow.com/questions/18039057/…Cela pourrait être un problème avec
Pour le résoudre, essayez de spécifier les arguments
sep
et / ouheader
lors de l'appelread_csv
. Par exemple,Dans le code ci-dessus,
sep
définit votre délimiteur etheader=None
indique aux pandas que vos données source n'ont pas de ligne pour les en-têtes / titres de colonne. Ainsi dit la documentation : "Si le fichier ne contient pas de ligne d'en-tête, alors vous devez explicitement passer header = None". Dans ce cas, pandas crée automatiquement des indices de nombres entiers pour chaque champ {0,1,2, ...}.Selon les documents, le délimiteur ne devrait pas être un problème. Les documents disent que "si sep est Aucun [non spécifié], il essaiera de le déterminer automatiquement." Cependant, je n'ai pas eu de chance avec cela, y compris des cas avec des délimiteurs évidents.
la source
L'analyseur devient confus par l'en-tête du fichier. Il lit la première ligne et déduit le nombre de colonnes de cette ligne. Mais les deux premières lignes ne sont pas représentatives des données réelles du fichier.
Essayez-le avec
data = pd.read_csv(path, skiprows=2)
la source
Votre fichier CSV peut avoir un nombre variable de colonnes et
read_csv
déduire le nombre de colonnes à partir des premières lignes. Deux façons de le résoudre dans ce cas:1) Modifiez le fichier CSV pour avoir une première ligne factice avec un nombre maximum de colonnes (et spécifiez
header=[0]
)2) Ou utilisez
names = list(range(0,N))
où N est le nombre maximum de colonnes.la source
C'est certainement un problème de délimiteur, car la plupart des CSV CSV sont créés en utilisant
sep='/t'
donc essayez d'read_csv
utiliser le caractère de tabulation en(\t)
utilisant le séparateur/t
. essayez donc d'ouvrir en utilisant la ligne de code suivante.la source
J'ai également eu ce problème, mais peut-être pour une raison différente. J'avais des virgules de fin dans mon CSV qui ajoutaient une colonne supplémentaire que les pandas tentaient de lire. En utilisant les travaux suivants, mais il ignore simplement les mauvaises lignes:
Si vous voulez garder les lignes un hack laid pour gérer les erreurs, faites quelque chose comme ceci:
J'ai procédé à l'écriture d'un script pour réinsérer les lignes dans le DataFrame car les mauvaises lignes seront données par la variable 'line' dans le code ci-dessus. Tout cela peut être évité en utilisant simplement le lecteur csv. Espérons que les développeurs de pandas pourront faciliter la gestion de cette situation à l'avenir.
la source
J'ai eu ce problème, où j'essayais de lire dans un CSV sans passer de noms de colonnes.
J'ai spécifié les noms de colonne dans une liste au préalable, puis je les ai passés dans
names
, et il l'a résolu immédiatement. Si vous n'avez pas défini de noms de colonne, vous pouvez simplement créer autant de noms d'espace réservé que le nombre maximal de colonnes qui peuvent se trouver dans vos données.la source
J'ai moi-même eu ce problème plusieurs fois. Presque à chaque fois, la raison en est que le fichier que j'essayais d'ouvrir n'était pas un CSV correctement enregistré pour commencer. Et par "correctement", je veux dire que chaque ligne avait le même nombre de séparateurs ou de colonnes.
En général, cela s'est produit parce que j'avais ouvert le CSV dans Excel, puis que je l'avais mal enregistré. Même si l'extension de fichier était toujours .csv, le format CSV pur avait été modifié.
Tout fichier enregistré avec pandas to_csv sera correctement formaté et ne devrait pas avoir ce problème. Mais si vous l'ouvrez avec un autre programme, cela peut changer la structure.
J'espère que cela pourra aider.
la source
Je suis tombé sur le même problème. L'utilisation
pd.read_table()
sur le même fichier source semble fonctionner. Je n'ai pas pu en trouver la raison, mais c'était une solution de contournement utile pour mon cas. Peut-être que quelqu'un de plus compétent peut éclairer pourquoi cela a fonctionné.Edit: J'ai trouvé que cette erreur se glisse lorsque vous avez du texte dans votre fichier qui n'a pas le même format que les données réelles. Il s'agit généralement d'informations d'en-tête ou de pied de page (supérieures à une ligne, donc skip_header ne fonctionne pas) qui ne seront pas séparées par le même nombre de virgules que vos données réelles (lors de l'utilisation de read_csv). L'utilisation de read_table utilise un onglet comme délimiteur qui pourrait contourner l'erreur actuelle des utilisateurs mais en introduire d'autres.
Je contourne généralement cela en lisant les données supplémentaires dans un fichier, puis en utilisant la méthode read_csv ().
La solution exacte peut différer en fonction de votre fichier réel, mais cette approche a fonctionné pour moi dans plusieurs cas
la source
Les éléments suivants ont fonctionné pour moi (j'ai publié cette réponse, car j'avais spécifiquement ce problème dans un bloc-notes Google Colaboratory):
la source
|
le délimiteur pour mon .csv. Je préfère essayer cette approche d'abord, au lieu de sauter des lignes ou de mauvaises lignes.J'ai rencontré un problème similaire en essayant de lire un tableau délimité par des tabulations avec des espaces, des virgules et des guillemets:
Cela indique qu'il a quelque chose à voir avec le moteur d'analyse C (qui est celui par défaut). Peut-être que changer en python changera quoi que ce soit
Maintenant, c'est une erreur différente.
Si nous continuons et essayons de supprimer des espaces de la table, l'erreur du moteur python change à nouveau:
Et il devient clair que les pandas avaient des problèmes pour analyser nos lignes. Pour analyser une table avec le moteur python, j'avais besoin de supprimer tous les espaces et les guillemets de la table au préalable. Pendant ce temps, le moteur C continuait de planter même avec des virgules en rangées.
Pour éviter de créer un nouveau fichier avec des remplacements, je l'ai fait, car mes tables sont petites:
tl; dr
Changez le moteur d'analyse, essayez d'éviter toute citation / virgule / espace non délimitant dans vos données.
la source
Le jeu de données que j'ai utilisé avait beaucoup de guillemets (") utilisés étrangers au formatage. J'ai pu corriger l'erreur en incluant ce paramètre pour
read_csv()
:la source
Utiliser un délimiteur dans le paramètre
Il va lire.
la source
Bien que ce ne soit pas le cas pour cette question, cette erreur peut également apparaître avec des données compressées. Définir explicitement la valeur pour
kwarg
compression
résoudre mon problème.la source
Une alternative que j'ai trouvée utile pour traiter des erreurs d'analyse similaires utilise le module CSV pour réacheminer les données vers un pandas df. Par exemple:
Je trouve que le module CSV est un peu plus robuste pour les fichiers séparés par des virgules mal formatés et j'ai donc réussi avec cet itinéraire à résoudre des problèmes comme ceux-ci.
la source
la séquence de commandes suivante fonctionne (je perds la première ligne des données -aucun en-tête = aucun présent-, mais au moins il se charge):
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']
Ce qui suit ne fonctionne PAS:
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))
CParserError: Erreur lors de la tokenisation des données. Erreur C: 53 champs attendus dans la ligne 1605634, vu 54 suivants ne fonctionnent pas:
df = pd.read_csv(filename, header=None)
CParserError: Erreur lors de la tokenisation des données. Erreur C: 53 champs attendus dans la ligne 1605634, 54
Par conséquent, dans votre problème, vous devez passer
usecols=range(0, 2)
la source
Pour ceux qui ont un problème similaire avec Python 3 sur Linux OS.
Essayer:
la source
Parfois, le problème n'est pas de savoir comment utiliser python, mais avec les données brutes.
J'ai ce message d'erreur
Il s'est avéré que dans la description de la colonne, il y avait parfois des virgules. Cela signifie que le fichier CSV doit être nettoyé ou qu'un autre séparateur doit être utilisé.
la source
utilisation
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
lorsque vous essayez de lire les données csv à partir du lien
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
J'ai copié les données du site dans mon fichier csv. Il y avait des espaces supplémentaires, donc utilisé sep = ',' et cela a fonctionné :)
la source
J'avais un ensemble de données avec des numéros de ligne préexistants, j'ai utilisé index_col:
la source
C'est ce que j'ai fait.
sep='::'
résolu mon problème:la source
J'ai eu un cas similaire à celui-ci et le réglage
travaillé
la source
J'ai le même problème lorsque read_csv: ParserError: erreur lors de la tokenisation des données. Je viens de sauvegarder l'ancien fichier csv dans un nouveau fichier csv. Le problème est résolu!
la source
Le problème pour moi était qu'une nouvelle colonne était ajoutée à mon CSV intraday . La solution de réponse acceptée ne fonctionnerait pas car chaque ligne future serait rejetée si j'utilisais
error_bad_lines=False
.La solution dans ce cas était d'utiliser le paramètre usecols dans
pd.read_csv()
. De cette façon, je peux spécifier uniquement les colonnes que je dois lire dans le CSV et mon code Python restera résistant aux futures modifications CSV tant qu'une colonne d'en-tête existe (et que les noms des colonnes ne changent pas).Exemple
Un autre avantage de ceci est que je peux charger beaucoup moins de données en mémoire si j'utilise seulement 3-4 colonnes d'un CSV qui a 18-20 colonnes.
la source
Résolution simple : ouvrez le fichier csv dans Excel et enregistrez-le avec un fichier de nom différent au format csv. Essayez à nouveau de l'importer spyder, votre problème sera résolu!
la source
J'ai rencontré cette erreur avec un guillemet errant. J'utilise un logiciel de cartographie qui mettra des guillemets autour des éléments de texte lors de l'exportation de fichiers délimités par des virgules. Le texte qui utilise des guillemets (par exemple '= pieds et "= pouces) peut être problématique lorsqu'il induit alors des collisions de délimiteur. Prenons cet exemple qui note qu'une impression de journal de puits de 5 pouces est mauvaise:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Utiliser
5"
comme raccourci pour5 inch
finir par jeter une clé dans les travaux. Excel supprimera simplement le guillemet supplémentaire, mais Pandas tombe en panne sans l'error_bad_lines=False
argument mentionné ci-dessus.la source
Autant que je sache, et après avoir jeté un œil à votre fichier, le problème est que le fichier csv que vous essayez de charger a plusieurs tables. Il existe des lignes vides ou des lignes contenant des titres de table. Essayez de jeter un œil à cette réponse Stackoverflow . Il montre comment y parvenir par programme.
Une autre approche dynamique pour ce faire serait d’utiliser le module csv , de lire chaque ligne à la fois et de faire des vérifications d'intégrité / des expressions régulières, pour déduire si la ligne est (titre / en-tête / valeurs / vide). Vous avez un avantage supplémentaire avec cette approche, que vous pouvez diviser / ajouter / collecter vos données en objets python comme vous le souhaitez.
Le plus simple serait d'utiliser la fonction pandas
pd.read_clipboard()
après avoir sélectionné et copié manuellement la table dans le presse-papiers, au cas où vous pourriez ouvrir le csv dans excel ou quelque chose.Hors du sujet :
De plus, sans rapport avec votre problème, mais parce que personne n'en a fait mention : j'ai eu ce même problème lors du chargement de certains ensembles de données, tels que ceux
seeds_dataset.txt
de l'UCI. Dans mon cas, l'erreur se produisait car certains séparateurs avaient plus d'espaces blancs qu'un véritable onglet\t
. Voir la ligne 3 dans l'exemple suivant par exemplePar conséquent, utilisez-le
\t+
dans le modèle de séparateur au lieu de\t
.la source
Dans mon cas, c'est parce que le format des deux premières et dernières lignes du fichier csv est différent du contenu intermédiaire du fichier.
Donc, ce que je fais est d'ouvrir le fichier csv sous forme de chaîne, d'analyser le contenu de la chaîne, puis d'utiliser
read_csv
pour obtenir une trame de données.la source
Dans mon cas, le séparateur n'était pas le "," par défaut mais Tab.
Remarque: "\ t" n'a pas fonctionné comme suggéré par certaines sources. "\\ t" était requis.
la source
J'ai eu une erreur similaire et le problème était que j'avais des guillemets d'échappement dans mon fichier csv et que je devais définir le paramètre escapechar de manière appropriée.
la source