![](/img/trans.png)
[英]Python Pandas DataFrame read_csv UnicodeDecodeError
[英]python pandas read_csv taking forever
我正在尝试使用 panda 加载一个 128MB 的文件(谷歌搜索后我发现它比 open 或 np.loadtxt 快)。 该文件有 1000 行,每行包含 65K 个值,这些值是 0 或 1,由单个空格分隔。
出于某种原因,这需要很长时间,我不知道为什么。 128MB 对我来说听起来很小,Matlab 会在大约一分钟内加载它。
这是我的(简单)代码:
import os
import numpy as np
import pandas as pd
import time
DATA_DIR='D:\BinaryDescriptors3\ORBLearningIntermediatResults2'
TEST_DIR='yosemite_harris'
OUT_DIR='D:\BinaryDescriptors3\ORBLearningTripletsFinalResults'
PATCH_NUM=1000
data_filename=TEST_DIR+'_' + str(PATCH_NUM) + '_ORBresfile.txt'
data_filepath = os.path.join(DATA_DIR,data_filename)
s=time.time()
print "START"
data = pd.read_csv(data_filepath,delimiter=' ')
e=time.time()
print e-s
它从未到达最后一行(我在终止它之前给了它 30 分钟)。 为什么读取一个 128MB 的小文件需要这么长时间?
编辑:
尝试使用以下命令仅读取一行时:
数据 = pd.read_csv(data_filepath,delimiter='', nrows=1)
我收到以下错误:
Traceback (most recent call last):
File "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py", line 2090, in <module>
debugger.run(setup['file'], None, None)
File "C:\eclipse\plugins\org.python.pydev_3.7.1.201409021729\pysrc\pydevd.py", line 1547, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\BinaryDescriptors3\Python\LearnTripletsOrb\LearnTripletsOrb.py", line 18, in <module>
data = pd.read_csv(data_filepath,delimiter=' ', nrows=1)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 231, in _read
return parser.read(nrows)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 686, in read
ret = self._engine.read(nrows)
File "C:\Users\GilLevi\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1130, in read
data = self._reader.read(nrows)
File "parser.pyx", line 727, in pandas.parser.TextReader.read (pandas\parser.c:7146)
File "parser.pyx", line 774, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7707)
StopIteration
尝试读取仅包含一行 65K 字符的类似文件时,我还会收到以下错误:
回溯(最近一次调用):文件“C:\\eclipse\\plugins\\org.python.pydev_3.7.1.201409021729\\pysrc\\pydevd.py”,第 2090 行,在 debugger.run(setup['file'], None , None) File "C:\\eclipse\\plugins\\org.python.pydev_3.7.1.201409021729\\pysrc\\pydevd.py", line 1547, in run pydev_imports.execfile(file, globals, locals) #执行脚本文件" D:\\BinaryDescriptors3\\Python\\LearnTripletsOrb\\LearnTripletsOrb.py”,第 20 行,在 data = pd.read_csv(data_filepath,delimiter=' ', nrows=1) 文件“C:\\Users\\GilLevi\\Anaconda\\lib\\site-包\\pandas\\io\\parsers.py”,第 443 行,在 parser_f 中返回 _read(filepath_or_buffer, kwds)
文件“C:\\Users\\GilLevi\\Anaconda\\lib\\site-packages\\pandas\\io\\parsers.py”,第 231 行,在 _read 中返回 parser.read(nrows) 文件“C:\\Users\\GilLevi\\Anaconda\\lib \\site-packages\\pandas\\io\\parsers.py",第 686 行,在读取 ret = self._engine.read(nrows) 文件 "C:\\Users\\GilLevi\\Anaconda\\lib\\site-packages\\pandas\\io\\ parser.py”,第 1130 行,在读取数据 = self._reader.read(nrows) 文件“parser.pyx”,第 727 行,在 pandas.parser.TextReader.read (pandas\\parser.c:7146) 文件“parser .pyx",第 774 行,在 pandas.parser.TextReader._read_low_memory (pandas\\parser.c:7707) 中 StopIteration
我还尝试生成一个类似的文件,其中包含 2 行 65K,但使用“,”作为分隔符,并得到与 1 和 2 相同的错误。
如果 load_csv 不是正确的方法,你能推荐一个合适的替代方法吗?
这个问题很老,但我希望其他人可能会发现答案有用。
Pandas(不如 NumPy)在处理具有大量行和有限数量的列(例如,几十个顶部)的数据方面进行了优化(并且非常好)。 您的情况似乎相反,因此它不是完成任务的正确工具。
我会在将数据加载到 DataFrame 之前对其进行预处理,并且我会交换 DataFrame 中的列和行以进行进一步处理。 所以它是这样的:
df = pd.DataFrame(columns=[i for i in range(len(txt))])
txt = open(data_filepath).readlines()
for i, ln in enumerate(txt):
row_items = ln.split()
df[i] = row_items
...
我相信这会非常快......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.