Pandas: read_csv "CParserError: Error tokenizing data" avec un nombre variable de champs

Créé le 31 oct. 2015  ·  17Commentaires  ·  Source: pandas-dev/pandas

J'ai des problèmes avec read_csv (Pandas 0.17.0) en essayant de lire un fichier csv de plus de 380 Mo. Le fichier commence par 54 champs mais certaines lignes ont 53 champs au lieu de 54. L'exécution du code ci-dessous me donne l'erreur suivante:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
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),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

Erreur:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Si je passe le mot-clé error_bad_lines=False , les lignes problématiques s'affichent comme dans l'exemple ci-dessous:

Skipping line 1683401: expected 53 fields, saw 54

Cependant, j'obtiens l'erreur suivante cette fois (le DataFrame ne se charge pas non plus):

CParserError: Too many columns specified: expected 54 and found 53

Si je passe le mot-clé engine='python' , je n'obtiens aucune erreur, mais il faut beaucoup de temps pour analyser les données. Veuillez noter que 53 et 54 sont commutés dans les messages d'erreur selon que error_bad_lines=False est utilisé ou non.

IO CSV Usage Question

Commentaire le plus utile

Essaye ça:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Tous les 17 commentaires

ces erreurs sont toutes correctes. vous limitez ce que fait l'analyseur en passant usecols et names . ne faites pas cela et voyez si vous pouvez l'analyser.

très difficile de diagnostiquer quelque chose comme ça sans un échantillon du fichier qui se reproduit.

afficher aussi pd.show_versions()

Avec le fichier de données d'origine:

pd.read_csv(filename) sans autres mots clés semble analyser les données sans erreur. pd.read_csv(filename, header=None) donne l'erreur suivante:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Tout à fait d'accord qu'il est très difficile de diagnostiquer sans les données de l'échantillon. J'ai essayé de générer l'erreur avec un fichier csv avec quelques lignes (certaines ont 53 champs, d'autres 54), pd.read_csv comble les lacunes avec NaNs comme prévu. J'ai répété en passant usecols et header=None , ça marche toujours. Il semble que le fichier d'origine présente un problème qui soulève toutes les erreurs.

pd.show_versions() produit comme suit:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

est attendu car le nombre de colonnes est déduit de la première ligne. Si vous passez names vous l'utiliserez comme une caractéristique déterminante.

Alors continuez à essayer différentes options. Vous le contraignez un peu beaucoup en fait avec names et usecols . Vous feriez peut-être mieux de le lire, puis de le réindexer à ce dont vous avez besoin.

Si engine='python' est utilisé, curieusement, il charge le DataFrame sans aucun hoquet. J'ai utilisé l'extrait suivant pour extraire les 3 premières lignes du fichier et 3 des lignes incriminées (j'ai obtenu les numéros de ligne du message d'erreur).

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

Lignes 1 à 3:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Lignes offensantes:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Comme vous l'avez suggéré, je vais essayer de lire le fichier, puis modifier le DataFrame (renommer les colonnes, supprimer les colonnes inutiles, etc.) ou simplement utiliser le moteur python (temps de traitement long).

Par enquête plus approfondie, la séquence de commandes suivante fonctionne (je perds la première ligne des données -no header=None present-, mais au moins elle 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']

La suite 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: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

La suite ne fonctionne PAS :

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

fermeture comme question d'utilisation.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.csv")
ParserError: erreur de tokenisation des données. Erreur C: 1 champs attendus à la ligne 33, vu 3

Essaye ça:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Je l'ai essayé et j'ai travaillé pour une erreur similaire merci!

essayez d'ajouter quoting=3 lors de la lecture

y a-t-il un moyen pour les pandas d'ignorer simplement les champs supplémentaires dans toute ligne qui a plus de champs?
par exemple dans le cas "Attendu 53 champs à la ligne 1605634, vu 54"
il suffit de déposer le champ 54 à la ligne 1605634

Un autre cas! mais résolu avec "error_bad_lines = False", il imprime toujours l'erreur mais 'code de sortie 0'

J'ai eu la même erreur

Je viens d'ajouter le paramètre delimiter en mode read_csv

et ça a marché

error_bad_lines = Faux
Ça marche

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

est attendu car le nombre de colonnes est déduit de la première ligne. Si vous passez names vous l'utiliserez comme une caractéristique déterminante.

Alors continuez à essayer différentes options. Vous le contraignez un peu beaucoup en fait avec names et usecols . Vous feriez peut-être mieux de le lire, puis de le réindexer à ce dont vous avez besoin.

Cela marche! J'écris csv en utilisant le langage R et j'essaye de le lire en python. La première ligne doit avoir la longueur maximale pour toutes les lignes. Cette méthode résoudra le problème des mauvaises lignes et ne perdra aucune ligne.

Si vous essayez d'importer un fichier .xlsx à l'aide de la commande pd.read_csv, vous obtiendrez cette erreur.

Essayez d'utiliser pd.read_excel au lieu de pd.read_csv

Le moyen le plus simple de résoudre ce problème est de transformer votre fichier CSV en fichier Excel et d'utiliser pd.read_excel au lieu de pd.read_csv pour lire les données

Cette page vous a été utile?
0 / 5 - 0 notes