Ler arquivo delimitado por tabulação com Pandas - funciona no Windows, mas não no Mac

95

Tenho lido um arquivo de dados delimitado por tabulação no Windows com Pandas / Python sem problemas. O arquivo de dados contém notas nas primeiras três linhas e, em seguida, contém um cabeçalho.

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

Agora estou tentando ler este arquivo com meu Mac. (Minha primeira vez usando Python no Mac.) Recebo o seguinte erro.

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

Se definir o argumento error_bad_lines para read_csv como False , obtenho as seguintes informações, que continuam até o final da última linha.

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

Preciso especificar um valor para o argumento de codificação ? Parece que não deveria, porque a leitura do arquivo funciona bem no Windows.

user3062149
fonte
Você está usando exatamente a mesma versão do pandas em ambos os sistemas operacionais? Você pode fornecer alguns dados de amostra que ilustram o problema no Mac?
joris
não relacionado: você entende a diferença entre: (0)e (0,)em Python? Nota: (0)is 0e (0,)is 0,- a vírgula cria uma tupla (exceto uma vazia), não parênteses.
jfs
Você já tentou df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach
Olá a todos. Obrigado pelas sugestões. Eu produzi uma solução temporária, mas pode ser necessário rever este problema e procurar uma solução melhor no futuro. Se e quando eu fizer isso, analisarei sua sugestão. Minha solução temporária foi pegar o arquivo csv que eu tinha (e já havia convertido para o arquivo delimitado por tabulação problemático usando o Excel) e salvá-lo como .tsv com o Google docs. Usei o Gdocs apenas porque era o aplicativo de doc mais conveniente disponível para mim na época. Essa conversão funcionou. O Pandas foi capaz de ler o arquivo corretamente, acredito, e passar para o resto do meu código.
user3062149 de
Eu suspeito que o problema que você está vendo aqui com seu mac é terminadores de linha. Planilhas feitas em um Mac podem causar todos os tipos de comportamentos divertidos com várias bibliotecas, incluindo a lib csv_reader em
lixadeiras

Respostas:

153

A maior pista é que as linhas estão todas sendo retornadas em uma linha. Isso indica que os terminadores de linha estão sendo ignorados ou não estão presentes.

Você pode especificar o terminador de linha para csv_reader. Se você estiver em um mac, as linhas criadas terminarão com \ro padrão linux \nou, melhor ainda, com os suspensórios e cintos do windows \r\n.

pandas.read_csv(filename, sep='\t', lineterminator='\r')

Você também pode abrir todos os seus dados usando o pacote de codecs. Isso pode aumentar a robustez às custas da velocidade de carregamento do documento.

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')
lixadeiras de brad
fonte
4
A adição de código de codecs me ajudou. Então percebi que há um parâmetro em read_csv que faz o mesmo. Eu adicionei encoding = 'utf-16' e ele corrigiu o problema para mim.
Mikhail Venkov
5

Outra opção seria adicionar engine='python'ao comandopandas.read_csv(filename, sep='\t', engine='python')

user3479780
fonte