熊猫的 read_csv 总是在小文件上崩溃

Posted

技术标签:

【中文标题】熊猫的 read_csv 总是在小文件上崩溃【英文标题】:Panda's read_csv always crashes on small file 【发布时间】:2014-10-11 23:15:14 【问题描述】:

我正在尝试导入一个相当 small(217 行,87 列,15k)csv 文件以在 Python 中进行分析 使用 熊猫。该文件的结构相当糟糕,但我仍想导入它,因为它是我不想在 Python 之外手动操作的原始数据(例如使用 Excel)。不幸的是,它总是导致崩溃“内核似乎已经死了。它将自动重启”。

https://www.wakari.io/sharing/bundle/uniquely/ReadCSV

做了一些研究表明 read_csv 可能会崩溃,但总是针对非常大的文件,因此我不明白这个问题。使用本地安装(Anaconda 64 位、IPython (Py 2.7) Notebook)和 Wakari 都会发生崩溃。

有人可以帮我吗?将不胜感激。非常感谢!

代码:

# I have a somehow ugly, illustrative csv file, but it is not too big, 217 rows, 87 colums.
# File can be downloaded at http://www.win2day.at/download/lo_1986.csv

# In[1]:

file_csv = 'lo_1986.csv'
f = open(file_csv, mode="r")
x = 0
for line in f:
    print x, ": ", line
    x = x + 1
f.close()


# Now I'd like to import this csv into Python using Pandas - but this always lead to a crash:
# "The kernel appears to have died. It will restart automatically."

# In[ ]:

import pandas as pd
pd.read_csv(file_csv, delimiter=';')

# What am I doing wrong?

【问题讨论】:

除了文件非常混乱到 csv 之外,我还可以看到一些特殊字符。尝试一些不同的编码,或者在使用 pandas 读取文件之前处理文件 【参考方案1】:

这是因为文件中的字符无效(例如 0xe0)

如果您在 read_csv() 调用中添加 encoding 参数,您将看到此堆栈跟踪而不是 segfault

>>> df = pandas.read_csv("/tmp/lo_1986.csv", delimiter=";", encoding="utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/antkong/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 400, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/Users/antkong/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 205, in _read
    return parser.read()
  File "/Users/antkong/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 608, in read
    ret = self._engine.read(nrows)
  File "/Users/antkong/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 1028, in read
    data = self._reader.read(nrows)
  File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas/parser.c:6745)
  File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:6964)
  File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas/parser.c:7780)
  File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas/parser.c:8793)
  File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas/parser.c:9484)
  File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas/parser.c:10642)
  File "parser.pyx", line 1051, in pandas.parser.TextReader._string_convert (pandas/parser.c:10905)
  File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas/parser.c:15657)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: unexpected end of data

在要求 pandas 读取文件之前,您可以进行一些预处理以删除这些字符

附上图片突出文件中的无效字符

【讨论】:

【参考方案2】:

非常感谢您的发言。我完全同意这个评论,这确实是一个非常混乱的 csv。但不幸的是,这就是奥地利国家彩票分享他们的信息、开奖号码和支付报价的方式。

我继续玩,也看着特殊字符。最后,至少对我来说,解决方案非常简单:

pd.read_csv(file_csv, delimiter=';', encoding='latin-1', engine='python')

添加的编码有助于正确显示特殊字符,但游戏改变的是引擎参数。老实说,我不明白为什么,但现在可以了。

再次感谢!

【讨论】:

以上是关于熊猫的 read_csv 总是在小文件上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

合并熊猫 groupBy 对象

没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小

尾随分隔符使熊猫 read_csv 感到困惑

熊猫中的文件路径错误

如何加速熊猫 read_csv?

熊猫 read_csv 和 UTF-16