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.
(0)
e(0,)
em Python? Nota:(0)
is0
e(0,)
is0,
- a vírgula cria uma tupla (exceto uma vazia), não parênteses.df = pd.read_table(myfile, skiprows=[0,1,2], header=0)
?Respostas:
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
\r
o padrão linux\n
ou, 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')
fonte
Outra opção seria adicionar
engine='python'
ao comandopandas.read_csv(filename, sep='\t', engine='python')
fonte