熊猫的 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 总是在小文件上崩溃的主要内容,如果未能解决你的问题,请参考以下文章