Pandas: read_csv "CParserError: Erro ao tokenizar dados" com número variável de campos

Criado em 31 out. 2015  ·  17Comentários  ·  Fonte: pandas-dev/pandas

Estou tendo problemas com read_csv (Pandas 0.17.0) ao tentar ler um arquivo csv de 380+ MB. O arquivo começa com 54 campos, mas algumas linhas têm 53 campos em vez de 54. Executar o código a seguir me dá o seguinte erro:

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)

Erro:

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

Se eu passar a palavra-chave error_bad_lines=False , linhas problemáticas serão exibidas semelhantes ao exemplo abaixo:

Skipping line 1683401: expected 53 fields, saw 54

no entanto, recebo o seguinte erro desta vez (também o DataFrame não é carregado):

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

Se eu passar a palavra-chave engine='python' , não recebo nenhum erro, mas leva muito tempo para analisar os dados. Observe que 53 e 54 são trocados nas mensagens de erro dependendo se error_bad_lines=False é usado ou não.

IO CSV Usage Question

Comentários muito úteis

Experimente isto:

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

Todos 17 comentários

esses erros estão todos corretos. você está restringindo o que o analisador está fazendo passando usecols e names . não faça isso e veja se consegue analisá-lo.

muito difícil diagnosticar algo assim sem uma amostra do arquivo que reproduz.

também mostra pd.show_versions()

Com o arquivo de dados original:

pd.read_csv(filename) sem outras palavras-chave parece analisar os dados sem erros. pd.read_csv(filename, header=None) apresenta o seguinte erro:

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

Concordou totalmente que é muito difícil diagnosticar sem os dados da amostra. Tentei gerar o erro com um arquivo csv com algumas linhas (alguns têm 53 campos, outros 54), pd.read_csv preenche as lacunas com NaNs conforme o esperado. Repeti passando usecols e header=None , ainda funciona. Parece que o arquivo original tem algum tipo de problema que levanta todos os erros.

pd.show_versions() output da seguinte forma:

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

é esperado, pois o número de colunas é inferido a partir da primeira linha. Se você passar names se usará isso como um recurso determinante.

Portanto, continue tentando várias opções. Você está restringindo um pouco demais, na verdade, com names e usecols . Talvez seja melhor lê-lo e, em seguida, reindexar o que você precisa.

Se engine='python' for usado, curiosamente, ele carrega o DataFrame sem nenhum soluço. Usei o trecho a seguir para extrair as 3 primeiras linhas do arquivo e 3 das linhas problemáticas (obtive os números das linhas da mensagem de erro).

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))

Linhas 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']

Linhas ofensivas:

['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']

Como você sugeriu, tentarei ler o arquivo e, em seguida, modificar o DataFrame (renomear colunas, excluir as desnecessárias etc.) ou simplesmente usar o mecanismo python (longo tempo de processamento).

Por investigação adicional, a seguinte sequência de comandos funciona (eu perco a primeira linha dos dados -não header=None present-, mas pelo menos carrega):

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']

O que segue NÃO funciona:

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

O que segue NÃO funciona:

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

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

fechando como questão de uso.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA)
ParserError: Erro ao tokenizar dados. Erro C: esperado 1 campo na linha 33, vi 3

Experimente isto:

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

Tentei e funcionou para um erro semelhante, obrigado!

tente adicionar quoting=3 quando ler

Existe uma maneira de os pandas simplesmente ignorarem os campos extras em qualquer linha que tenha mais campos?
por exemplo, no caso "Esperados 53 campos na linha 1605634, viu 54"
basta soltar o campo 54 na linha 1605634

Outro caso! mas resolvido com "error_bad_lines = False", ele ainda exibe o erro, mas 'código de saída 0'

Eu tenho o mesmo erro

Acabei de adicionar o parâmetro delimitador no modo read_csv

e funcionou

error_bad_lines = False
funciona

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

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

é esperado, pois o número de colunas é inferido a partir da primeira linha. Se você passar names se usará isso como um recurso determinante.

Portanto, continue tentando várias opções. Você está restringindo um pouco demais, na verdade, com names e usecols . Talvez seja melhor lê-lo e, em seguida, reindexar o que você precisa.

Isso funciona! Escrevo csv usando a linguagem R e tento ler em python. A primeira linha deve ter o comprimento máximo para todas as linhas. Desta forma, corrigirá o problema de linhas ruins e não perderá nenhuma linha.

Se você tentar importar o arquivo .xlsx usando o comando pd.read_csv, obterá este erro.

Tente usar pd.read_excel em vez de pd.read_csv

A maneira mais fácil de corrigir isso é transformar seu arquivo CSV em arquivo Excel e usar pd.read_excel em vez de pd.read_csv para ler os dados

Esta página foi útil?
0 / 5 - 0 avaliações