Estou tentando usar pandas para manipular um arquivo .csv, mas recebo este erro:
pandas.parser.CParserError: Erro ao tokenizar dados. Erro C: 2 campos esperados na linha 3, serra 12
Eu tentei ler os documentos dos pandas, mas não encontrei nada.
Meu código é simples:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Como posso resolver isto? Devo usar o csv
módulo ou outro idioma?
O arquivo é de Morningstar
pandas.to_csv()
, PODE ser porque existe um '\ r' nos nomes das colunas; nesse caso, to_csv () gravará os nomes das colunas subsequentes na primeira coluna do quadro de dados, causando uma diferença entre o número de colunas nas primeiras X linhas. Essa diferença é uma causa do erro C.pd.read_csv("<path>", sep=";")
. Não use o Excel para verificação, pois às vezes coloca os dados em colunas por padrão e, portanto, remove o separador.Respostas:
você também pode tentar;
Observe que isso fará com que as linhas incorretas sejam ignoradas.
fonte
expected 8 fields, saw 9
?read_csv
. @PetraBarus, por que não adicionar colunas aos arquivos CSV que estão faltando (com valores nulos conforme necessário)?names=["col1", "col2", ...]
para o número máximo de colunas esperadas também funciona, e foi assim que resolvi esse problema quando me deparei com ele. Veja: stackoverflow.com/questions/18039057/…Pode ser um problema com
Para resolvê-lo, tente especificar os argumentos
sep
e / ouheader
ao chamarread_csv
. Por exemplo,No código acima,
sep
define seu delimitador eheader=None
informa aos pandas que seus dados de origem não têm linha para títulos de cabeçalhos / colunas. Assim diz os documentos : "Se o arquivo não contiver linha de cabeçalho, você deverá passar explicitamente o cabeçalho = Nenhum". Nesse caso, os pandas criam automaticamente índices de número inteiro para cada campo {0,1,2, ...}.De acordo com os documentos, o delimitador não deve ser um problema. Os documentos dizem que "se sep for Nenhum [não especificado], tentará determinar isso automaticamente". No entanto, não tive boa sorte com isso, incluindo instâncias com delimitadores óbvios.
fonte
O analisador está ficando confuso com o cabeçalho do arquivo. Ele lê a primeira linha e infere o número de colunas dessa linha. Mas as duas primeiras linhas não são representativas dos dados reais no arquivo.
Experimente com
data = pd.read_csv(path, skiprows=2)
fonte
Seu arquivo CSV pode ter um número variável de colunas e
read_csv
inferir o número de colunas das primeiras linhas. Duas maneiras de resolvê-lo neste caso:1) Altere o arquivo CSV para ter uma primeira linha fictícia com número máximo de colunas (e especifique
header=[0]
)2) Ou use
names = list(range(0,N))
onde N é o número máximo de colunas.fonte
Definitivamente, esse é um problema do delimitador, já que a maioria dos CSVs CSV é criada usando,
sep='/t'
então tenteread_csv
usar o caractere de tabulação(\t)
usando o separador/t
. portanto, tente abrir usando a seguinte linha de código.fonte
Eu também tive esse problema, mas talvez por um motivo diferente. Eu tinha algumas vírgulas no CSV que estavam adicionando uma coluna adicional que os pandas estavam tentando ler. Usando o seguinte funciona, mas simplesmente ignora as linhas incorretas:
Se você deseja manter as linhas um tipo feio de hack para lidar com os erros, faça algo como o seguinte:
Comecei a escrever um script para reinserir as linhas no DataFrame, pois as linhas incorretas serão fornecidas pela variável 'line' no código acima. Tudo isso pode ser evitado usando simplesmente o leitor csv. Esperamos que os desenvolvedores de pandas possam tornar mais fácil lidar com essa situação no futuro.
fonte
Eu tive esse problema, onde estava tentando ler em um CSV sem passar os nomes das colunas.
Especifiquei os nomes das colunas em uma lista com antecedência e depois os passei para eles
names
, e eles foram resolvidos imediatamente. Se você não tiver definido nomes de colunas, poderá criar tantos nomes de espaços reservados quanto o número máximo de colunas que possam estar em seus dados.fonte
Eu já tive esse problema algumas vezes. Quase todas as vezes, o motivo é que o arquivo que eu estava tentando abrir não era um CSV salvo corretamente para começar. E por "corretamente", quero dizer que cada linha tinha o mesmo número de separadores ou colunas.
Normalmente, isso aconteceu porque eu abri o CSV no Excel e o salvei incorretamente. Embora a extensão do arquivo ainda fosse .csv, o formato CSV puro havia sido alterado.
Qualquer arquivo salvo com pandas to_csv será formatado corretamente e não deverá ter esse problema. Mas se você abrir com outro programa, isso poderá alterar a estrutura.
Espero que ajude.
fonte
Me deparei com o mesmo problema. Usar
pd.read_table()
o mesmo arquivo de origem pareceu funcionar. Não consegui rastrear o motivo disso, mas foi uma solução útil para o meu caso. Talvez alguém com mais conhecimento possa esclarecer melhor por que funcionou.Editar: descobri que esse erro ocorre quando você tem algum texto em seu arquivo que não possui o mesmo formato que os dados reais. Geralmente, são informações de cabeçalho ou rodapé (maiores que uma linha, portanto skip_header não funciona) que não serão separadas pelo mesmo número de vírgulas que seus dados reais (ao usar read_csv). O uso de read_table usa uma guia como delimitador, o que pode contornar o erro atual do usuário, mas apresentar outros.
Eu costumo contornar isso lendo os dados extras em um arquivo e depois usando o método read_csv ().
A solução exata pode diferir dependendo do seu arquivo real, mas essa abordagem funcionou para mim em vários casos
fonte
O seguinte funcionou para mim (publiquei esta resposta, porque especificamente tive esse problema em um Caderno colaborativo do Google):
fonte
|
como delimitador para o meu .csv. Prefiro tentar essa abordagem primeiro, em vez de pular linhas ou linhas ruins.Eu tive um problema semelhante ao tentar ler uma tabela delimitada por tabulação com espaços, vírgulas e aspas:
Isso diz que tem algo a ver com o mecanismo de análise C (que é o padrão). Talvez mudar para um python mude qualquer coisa
Agora esse é um erro diferente.
Se seguirmos em frente e tentar remover espaços da tabela, o erro do python-engine será alterado novamente:
E fica claro que os pandas estavam tendo problemas para analisar nossas linhas. Para analisar uma tabela com o mecanismo python, eu precisava remover todos os espaços e aspas da tabela antes. Enquanto isso, o motor C continuava batendo mesmo com vírgulas em filas.
Para evitar a criação de um novo arquivo com substituições, fiz isso, pois minhas tabelas são pequenas:
tl; dr
Altere o mecanismo de análise, tente evitar aspas / vírgulas / espaços não delimitadores em seus dados.
fonte
O conjunto de dados que eu usei tinha muitas aspas (") estranhas à formatação. Consegui corrigir o erro incluindo este parâmetro para
read_csv()
:fonte
Use delimitador no parâmetro
Vai ler.
fonte
Embora não seja o caso desta pergunta, esse erro também pode aparecer com dados compactados. Definir explicitamente o valor para o
kwarg
compression
meu problema foi resolvido.fonte
Uma alternativa que eu achei útil para lidar com erros de análise semelhantes usa o módulo CSV para redirecionar dados para um pandas df. Por exemplo:
Acho que o módulo CSV é um pouco mais robusto para arquivos separados por vírgula mal formatados e, portanto, obtivemos sucesso com essa rota para resolver problemas como esses.
fonte
a seguinte sequência de comandos funciona (eu perco a primeira linha dos dados - sem cabeçalho = Nenhum presente -, 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']
A seguir 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: Erro ao tokenizar dados. Erro C: 53 campos esperados na linha 1605634, serra 54 A seguir NÃO funciona:
df = pd.read_csv(filename, header=None)
CParserError: Erro ao tokenizar dados. Erro C: 53 campos esperados na linha 1605634, serra 54
Portanto, no seu problema, você deve passar
usecols=range(0, 2)
fonte
Para aqueles que estão tendo problemas semelhantes com o Python 3 no SO Linux.
Tentar:
fonte
Às vezes, o problema não é como usar python, mas com os dados brutos.
Recebi esta mensagem de erro
Verificou-se que, na descrição da coluna, às vezes havia vírgulas. Isso significa que o arquivo CSV precisa ser limpo ou outro separador usado.
fonte
usar
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
ao tentar ler dados csv do link
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Copiei os dados do site para o meu csvfile. Tinha espaços extras, então usava sep = ',' e funcionava :)
fonte
Eu tinha um conjunto de dados com números de linha existentes, usei index_col:
fonte
Foi o que eu fiz.
sep='::'
resolveu meu problema:fonte
Eu tive um caso semelhante como este e definindo
trabalhou
fonte
Eu tenho o mesmo problema quando read_csv: ParserError: Erro ao tokenizar dados. Acabei de salvar o arquivo csv antigo em um novo arquivo csv. O problema está resolvido!
fonte
O problema para mim foi que uma nova coluna foi anexada ao meu intraday CSV . A solução de resposta aceita não funcionaria, pois todas as linhas futuras seriam descartadas se eu usasse
error_bad_lines=False
.A solução neste caso era usar os usecols parâmetro
pd.read_csv()
. Dessa forma, posso especificar apenas as colunas que preciso ler no CSV e meu código Python permanecerá resiliente a futuras alterações no CSV, desde que exista uma coluna de cabeçalho (e os nomes das colunas não sejam alterados).Exemplo
Outro benefício disso é que eu posso carregar muito menos dados na memória se estiver usando apenas 3-4 colunas de um CSV com 18 a 20 colunas.
fonte
Resolução simples : abra o arquivo csv no excel e salve-o com um arquivo de nome diferente do formato csv. Tente importá-lo novamente, seu problema será resolvido!
fonte
Eu encontrei esse erro com aspas dispersas. Eu uso o software de mapeamento que coloca aspas nos itens de texto ao exportar arquivos delimitados por vírgula. O texto que usa aspas (por exemplo, '= pés e "= polegadas) pode ser problemático ao induzir colisões com delimitadores. Considere este exemplo que observa que uma impressão de log de poço de 5 polegadas é ruim:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Usar
5"
como taquigrafia para5 inch
acaba jogando uma chave inglesa nas obras. O Excel simplesmente retira as aspas extras, mas o Pandas falha sem oerror_bad_lines=False
argumento mencionado acima.fonte
Até onde eu sei, e depois de examinar seu arquivo, o problema é que o arquivo csv que você está tentando carregar possui várias tabelas. Existem linhas vazias ou linhas que contêm títulos de tabela. Tente dar uma olhada nesta resposta do Stackoverflow . Ele mostra como conseguir isso programaticamente.
Outra abordagem dinâmica para fazer isso seria usar o módulo csv , ler todas as linhas de cada vez e fazer verificações de sanidade / expressões regulares, para inferir se a linha é (título / cabeçalho / valores / em branco). Você tem mais uma vantagem com essa abordagem: pode dividir / acrescentar / coletar seus dados em objetos python, conforme desejado.
O mais fácil de tudo seria usar a função pandas
pd.read_clipboard()
após selecionar e copiar manualmente a tabela na área de transferência, caso você possa abrir o csv no excel ou algo assim.Irrelevante :
Além disso, é irrelevante para o seu problema, mas porque ninguém mencionou isso : eu tive esse mesmo problema ao carregar alguns conjuntos de dados como o
seeds_dataset.txt
da UCI. No meu caso, o erro estava ocorrendo porque alguns separadores tinham mais espaços em branco do que uma guia verdadeira\t
. Veja a linha 3 a seguir, por exemploPortanto, use
\t+
no padrão separador em vez de\t
.fonte
No meu caso, é porque o formato da primeira e da última duas linhas do arquivo csv é diferente do conteúdo intermediário do arquivo.
Então, o que faço é abrir o arquivo csv como uma sequência, analisar o conteúdo da sequência e usar
read_csv
para obter um quadro de dados.fonte
No meu caso, o separador não era o padrão "," mas a tab.
Nota: "\ t" não funcionou como sugerido por algumas fontes. "\\ t" foi necessário.
fonte
Ocorreu um erro semelhante e o problema era que eu tinha algumas aspas escapadas no meu arquivo csv e precisava definir o parâmetro escapechar adequadamente.
fonte