【发布时间】:2020-09-20 07:08:51
【问题描述】:
我有一个 csv 文件太大而无法一次全部读入内存(约 46 GB),我想要一个可以放入内存的数据子集。我可以读取文件的一部分,通过使用先前创建的过滤索引进行内部连接来过滤掉我不想要的内容,然后继续到文件的下一部分,如下所示:
with open('Filtered_By_Month/all_data.csv','r') as f:
cols=np.array(f.readline().strip('\n').split(','))#column names
data=[]
df=None
for i in f:
data.append(i.strip('\n').split(',')
if len(data)==1000000:
df_sub=pd.DataFrame(data,columns=cols).set_index('KEY_')
df_sub=df_sub.join(filtered_keys,how='inner')
data=[]
if df is None:
df=df_sub
else:
df=pd.concat([df,df_sub])
这似乎可以解决问题,只是速度非常慢。另一种方法是使用 pandas read_csv 函数以及 nrows 和 skip_rows 参数,但这也变得非常慢,因为每次我调用 read_csv 方法时,文件都会重新打开并且光标位于第一行,我必须遍历这些行,直到我经过skip_rows。有没有办法将这两种方法结合起来,以便我将一个文件传递给已经打开的 read_csv,因此我不需要重新开始光标。
【问题讨论】:
-
pd.read_csv有一个nrows选项。我相信你的案子可以用pd.read_csv('file.csv', nrows=1000000)来完成。 -
根据文档,
read_csv确实接受类似文件的对象。