我是python的新手。我有许多巨大的txt文件(csv逗号分隔),我需要同时读入和处理。我有一个类似下面的函数,一旦我想要读取下一行就被调用。但是,此函数假定数据已存在于RAM中的python集合中。这正是我想要避免的,因为它甚至在阅读了数千个仍然可读的文件之后就压倒了RAM。
有没有办法可以把它变成get_new_bar_one_line_at_a_time_from_file?事实是,我想让它对函数的用户非常透明。一个内存映射文件,其中(重载)operator []自动读取一行并且 yield 它可能是最透明的?
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 []知道它需要从文件中获取下一行而只需要该行,并且所有这些都与Pandas一起工作。