【发布时间】:2011-11-11 15:58:50
【问题描述】:
我在尝试拆分大文件(例如,大约 10GB)时遇到了一些麻烦。基本思想是简单地读取行,并将每行(例如 40000 行)分组到一个文件中。 但是有两种“读取”文件的方式。
1) 第一个是一次读取整个文件,并把它变成一个列表。但这需要将整个文件加载到内存中,这对于太大的文件来说是很痛苦的。 (我想我以前问过这样的问题) 在 python 中,我尝试过的一次读取整个文件的方法包括:
input1=f.readlines()
input1 = commands.getoutput('zcat ' + file).splitlines(True)
input1 = subprocess.Popen(["cat",file],
stdout=subprocess.PIPE,bufsize=1)
那么,我可以很容易地将 40000 行分组到一个文件中:list[40000,80000] or list[80000,120000]
或者使用列表的好处是我们可以很容易地指向特定的行。
2)第二种方式是逐行读取;读取时处理该行。那些读取的行不会保存在内存中。 示例包括:
f=gzip.open(file)
for line in f: blablabla...
或
for line in fileinput.FileInput(fileName):
我确定对于 gzip.open,这个 f 不是一个列表,而是一个文件对象。似乎我们只能逐行处理;那么我该如何执行这个“拆分”工作呢?如何指向文件对象的特定行?
谢谢
【问题讨论】:
-
当你想到它时..你不能。只有在您阅读了所有前面的行并计算了换行符 (\n) 之后,您才能知道您在哪一行。 (忽略特殊情况,这是一个奇怪的文件,其中每一行的长度都是已知的。)