所以我尝试用python读入一个大的数据文件。如果数据有一列和一百万行,我会这样做:
fp = open(ifile,'r');
for row in fp:
process row当我读入的数据有一百万列,只有一行时,我的问题就出现了。我想要的是一个与C中的fscanf()函数类似的功能。
也就是说,
while not EOF:
part_row = read_next(%lf)
work on part_row如果我知道格式是long float或其他什么,我可以使用fp.read(%lf)。
有什么想法吗?
发布于 2013-02-21 08:14:23
有两种基本的方法来解决这个问题:
首先,您可以使用自己的显式缓冲区编写read_column函数,或者将其作为生成器函数:
def column_reader(fp):
buf = ''
while True:
col_and_buf = self.buf.split(',', 1)
while len(col_and_buf) == 1:
buf += fp.read(4096)
col_and_buf = buf.split(',', 1)
col, buf = col_and_buf
yield col…或者作为一个类:
class ColumnReader(object):
def __init__(self, fp):
self.fp, self.buf = fp, ''
def next(self):
col_and_buf = self.buf.split(',', 1)
while len(col_and_buf) == 1:
self.buf += self.fp.read(4096)
col_and_buf = self.buf.split(',', 1)
self.buf = buf
return col但是,如果您编写了一个在内部处理缓冲的read_until函数,那么您可以这样做:
next_col = read_until(fp, ',')[:-1]在ActiveState上有多个read_until食谱。
或者,如果你mmap这个文件,你实际上是免费得到的。您可以将该文件视为一个巨大的字符串,并对其使用find (或正则表达式)。(这假设整个文件都适合您的虚拟地址空间--在64位Python构建中可能不是问题,但在32位构建中可能会有问题。)
显然,这些都是不完整的。它们不处理EOF或换行符(在现实生活中,您可能有6行百万列,而不是1行,对吧?),但这应该足以说明问题。
https://stackoverflow.com/questions/14992248
复制相似问题