Python 2.7 在python中根据需要逐行延迟读取文件
我对python非常陌生。我有许多巨大的txt文件(csv逗号分隔),我需要同时读取和处理。我有一个类似下面的函数,一旦我想读取下一行,它就会被调用。但是,此函数假定数据已经在RAM中的python集合中。这正是我试图避免的,因为即使在从数千个仍在读取的文件中读取了一些文件之后,它仍然会压倒RAM 有什么办法可以让我从文件中一次一行地把它变成一个新的酒吧吗?问题是,我想让它对函数的用户非常透明。一个内存映射文件,其中(重载)运算符[]自动读入一行,产生它可能是最透明的Python 2.7 在python中根据需要逐行延迟读取文件,python-2.7,pandas,lazy-loading,Python 2.7,Pandas,Lazy Loading,我对python非常陌生。我有许多巨大的txt文件(csv逗号分隔),我需要同时读取和处理。我有一个类似下面的函数,一旦我想读取下一行,它就会被调用。但是,此函数假定数据已经在RAM中的python集合中。这正是我试图避免的,因为即使在从数千个仍在读取的文件中读取了一些文件之后,它仍然会压倒RAM 有什么办法可以让我从文件中一次一行地把它变成一个新的酒吧吗?问题是,我想让它对函数的用户非常透明。一个内存映射文件,其中(重载)运算符[]自动读入一行,产生它可能是最透明的 import pandas
import pandas as pd
self.symbol_data = {}
self.symbol_data[s] = pd.read_csv(fullPath,
decimal='.',
sep=',',
#chunksize = 4, #if use chunksize doesn't work with indexing
#parse_dates=[[0,1]],
index_col=[0]
)
# This doesn't work if I enable chunking above.But if no indexing, then nothing works
#comb_index = self.symbol_data[s].index
def get_new_bar(self, symbol):
for b in self.symbol_data[symbol]:
yield tuple([symbol, b[0], b[1][0], b[1][1], b[1][2], b[1][3], b[1][4], b[1][5], b[1][6]])
我这样称呼它
for s in self.symbol_list:
gen = iter(self.get_new_bar(s))
bar = gen.next()
如果我能说,我会很高兴的
def lazy_get_new_bar(self, symbol):
for b in self.symbol_data_from_file[symbol]:
yield tuple([symbol, b[0], b[1][0], b[1][1], b[1][2], b[1][3], b[1][4], b[1][5], b[1][6]])
b[]s知道它需要从文件中获取下一行,并且只有那一行,而且一直都与Pandas一起工作。看看pytables/hdf5,Pandas还没有真正支持这种东西。@U2EF1我不同意:杰夫,我试过你的分块。为了让它工作,我不得不删除索引。现在,当我访问数据时,我会遇到一些小错误,例如,yield tuple([symbol,b[0],b[1][0],b[1][1],b[1][2],b[1][3],b[1][4],b[1][5],b[1][6])在底部给出一个堆栈跟踪:pandas.hashtable.PyObjectHashTable.get_项(pandas/hashtable.c:11861)中的第704行的文件“hashtable.pyx”我不确定索引在存在分块的情况下是否有意义…@Ivan不确定您在这里试图做什么。分块给你一个更小的(分块大小的帧)。