Oi,
Encontrei um conjunto de dados em que o read_csv do motor C tem problemas. Não tenho certeza do problema exato, mas reduzi-o a uma única linha, que selecionei e enviei para a caixa de depósito . Se você obtiver o pickle, tente o seguinte:
df = pd.read_pickle('faulty_row.pkl')
df.to_csv('faulty_row.csv', encoding='utf8', index=False)
df.read_csv('faulty_row.csv', encoding='utf8')
Recebo a seguinte exceção:
CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
Se você tentar ler o CSV usando o mecanismo Python, nenhuma exceção será lançada:
df.read_csv('faulty_row.csv', encoding='utf8', engine='python')
Sugerindo que o problema é com read_csv e não to_csv. As versões que uso são:
INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Linux
OS-release: 3.19.0-28-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_GB.UTF-8
pandas: 0.16.2
nose: 1.3.7
Cython: 0.22.1
numpy: 1.9.2
scipy: 0.15.1
IPython: 3.2.1
patsy: 0.3.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
Sua penúltima linha inclui uma pausa '\r'
. Acho que é um bug, mas uma solução alternativa é abrir no modo de nova linha universal.
pd.read_csv(open('test.csv','rU'), encoding='utf-8', engine='c')
Também estou encontrando esse erro. Usar o método sugerido por @ chris-b1 causa o seguinte erro:
Traceback (most recent call last):
File "C:/Users/je/Desktop/Python/comparison.py", line 30, in <module>
encoding='utf-8', engine='c')
File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 498, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 275, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 590, in __init__
self._make_engine(self.engine)
File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 731, in _make_engine
self._engine = CParserWrapper(self.f, **self.options)
File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 1103, in __init__
self._reader = _parser.TextReader(src, **kwds)
File "pandas\parser.pyx", line 515, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4948)
File "pandas\parser.pyx", line 705, in pandas.parser.TextReader._get_header (pandas\parser.c:7386)
File "pandas\parser.pyx", line 829, in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:8838)
File "pandas\parser.pyx", line 1833, in pandas.parser.raise_parser_error (pandas\parser.c:22649)
pandas.parser.CParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.
+1
Também encontrei esse problema ao ler um arquivo csv grande com o egine padrão. Se eu usar engine = 'python' então funciona bem.
Perdi a resposta
Você precisa
df = pd.read_csv('test.csv', engine='python')
teve o mesmo problema ao tentar ler uma pasta que não era um arquivo csv
Alguém investigou esse problema? Está acabando com o desempenho ao usar read_csv em um gerador keras.
Os dados originais fornecidos não estão mais disponíveis, portanto o problema não pode ser reproduzido. Fechando porque não está claro qual é o problema, mas @dgrahn ou qualquer outra pessoa, se você puder fornecer um exemplo reproduzível, podemos reabrir
@WillAyd Avise-me se precisar de informações adicionais.
Como o GitHub não aceita CSVs, alterei a extensão para .txt.
Aqui está o código que irá disparar a exceção.
for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)):
pass
Aqui está o arquivo: debug.txt
Aqui está a exceção do Windows 10, usando o Anaconda.
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1007, in __next__
return self.get_chunk()
File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1070, in get_chunk
return self.read(nrows=size)
File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1036, in read
ret = self._engine.read(nrows)
File "D:\programs\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1848, in read
data = self._reader.read(nrows)
File "pandas\_libs\parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
File "pandas\_libs\parsers.pyx", line 903, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas\_libs\parsers.pyx", line 945, in pandas._libs.parsers.TextReader._read_rows
File "pandas\_libs\parsers.pyx", line 932, in pandas._libs.parsers.TextReader._tokenize_rows
File "pandas\_libs\parsers.pyx", line 2112, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
E o mesmo no RedHat.
$ python3
Python 3.6.6 (default, Aug 13 2018, 18:24:23)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> for chunk in pandas.read_csv('debug.csv', chunksize=1000, names=range(2504)): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1007, in __next__
return self.get_chunk()
File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1070, in get_chunk
return self.read(nrows=size)
File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1036, in read
ret = self._engine.read(nrows)
File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1848, in read
data = self._reader.read(nrows)
File "pandas/_libs/parsers.pyx", line 876, in pandas._libs.parsers.TextReader.read
File "pandas/_libs/parsers.pyx", line 903, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas/_libs/parsers.pyx", line 945, in pandas._libs.parsers.TextReader._read_rows
File "pandas/_libs/parsers.pyx", line 932, in pandas._libs.parsers.TextReader._tokenize_rows
File "pandas/_libs/parsers.pyx", line 2112, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
@dgrahn Baixei debug.txt e recebo o seguinte se você executar pd.read_csv('debug.xt', header=None)
em um mac:
ParserError: Erro ao tokenizar dados. Erro C: Esperados 204 campos na linha 3, viu 2504
Que é diferente do erro Buffer overflow caught
originalmente descrito.
Eu inspecionei o arquivo debug.txt e as duas primeiras linhas têm 204 colunas, mas a terceira linha tem 2504 colunas. Isso tornaria o arquivo não analisável e explica por que um erro é gerado.
Isso é esperado? O GitHub pode estar fazendo alguma conversão implícita em segundo plano entre os tipos de nova linha ("\ r \ n" e "\ n") que está bagunçando o exemplo carregado.
@joshlk Você usou a opção names=range(2504)
conforme descrito no comentário acima?
@dgrahn bom ponto.
Ok agora pode reproduzir o erro com pandas.read_csv('debug.csv', chunksize=1000, names=range(2504))
.
É bom notar que pandas.read_csv('debug.csv', names=range(2504))
funciona bem e, portanto, é improvável que esteja relacionado ao bug original, mas está produzindo o mesmo sintoma.
@joshlk Eu poderia abrir um problema separado, se preferir.
pd.read_csv(open('test.csv','rU'), encoding='utf-8', engine='python')
Resolveu meu problema.
engine = 'python'
Tentei essa abordagem e consegui fazer upload de grandes arquivos de dados. Mas quando verifiquei a dimensão do dataframe, vi que o número de linhas aumentou. Quais podem ser as regiões lógicas para isso?
Comentários muito úteis
Perdi a resposta
Você precisa