在循环中读取大文件

时间:2015-10-29 14:06:49

标签: python large-files

当我想要读取它们并在while循环中使用它时,我在处理大型文本文件(大约1GB)时遇到了一些麻烦。

更具体地说:首先,我首先对文件的行进行一些解析,以便找到例如所有以" x"开头的行。在这样做时,我将找到的行的索引添加到列表中(比如l)。这是预处理部分。

现在在while循环中,我从l中选择随机索引,并想要读取其对应的行(或者说它周围有5行)。因此,我需要在整个while循环中将文件保存在内存中,作为先验,我不知道我最终读取了哪些行(该行是从l中随机选取的)。

问题是,当我在主循环之前调用文件时,在第一次循环运行期间,读取成功完成,但是从第二次运行开始,文件已从内存中消失。我尝试过:

预处理部分:

for i, line in enumerate(filename):
    prep = ''.join(c for c in line if c.isalnum() or c.isspace())
    if 'x' in prep: l.append(i)

现在我有了我的名单。在主循环之前将文件加载到内存中:

with open(filename,'r') as f:
    while (some condition):
        random_index = random.sample(range(0,len(l)),1)
        output_file = open("out","w") #I will write here the read line(s)
        for i, line in enumerate(f):
            #(the lines to be read, starting from the given random index)
            if (i >= l[random_index]) and (i < l[random_index+1]): 
                out.write(line)
        out.close()

只有在循环的第一次运行期间,事情才能正常运行。 或者我也尝试过:

f = open(filename)
while (some condition):
    random_index = ... #rest is same as above.

同样的问题,只有第一次运行。有一件事是将f=open(filename)置于循环中,因此每次运行都会调用该文件。但由于它很大,这实际上是没有实际的解决方案。

  • 我在这里做错了什么?
  • 如何正确完成这些阅读?

1 个答案:

答案 0 :(得分:1)

  

我在这里做错了什么?

This answer解决了同样的问题:您无法两次读取文件。

您在f循环之外打开文件while,并在for i, line in enumerate(f):循环的第一次迭代期间通过调用while完全读取它。在第二次迭代期间,您无法再次读取它,因为它已经被读过。

  

这些读数应该如何正确完成?

如链接答案中所述:

  

要直接回答您的问题,一旦读取了文件,使用read(),您可以使用seek(0)将读取光标返回到文件的开头(文档为here) 。

这意味着,为了解决您的问题,您可以在f.seek(0)循环的末尾添加while,以便在每次迭代后将指针移动到文件的开头。这样做可以重新开始重新读取文件。