在python中根据需要逐行读取文件

时间:2014-07-08 23:50:19

标签: python-2.7 pandas lazy-loading

我是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一起工作。

0 个答案:

没有答案