Python,如何在反复读取同一文件的同时将枚举的迭代器设置为0

时间:2017-06-19 14:15:29

标签: python loops

with open("...txt") as fp: 
    for i, line in enumerate(fp): 
        if some condition : 
            i=0
            fp.seek(0)

文本很大,GB数据因此我使用枚举。我需要处理这个巨大的文件数千次,所以我决定在第一时间打开它以提高效率。但是,尽管此代码有效,但i不会变为0,它只会继续递增。我需要它为零,因为我需要行i的位置。并且每次数十亿*数千倍并且进行一些模运算是低效的。

所以我的问题是当我回到文件的开头时,如何将i设置为零?在此先感谢(我使用python 3.6)

3 个答案:

答案 0 :(得分:3)

可以总是制作你自己的可重置枚举器,但可能有更好的方法去做你真正想做的事。

仍然,这是一个可重置的枚举器的样子:

 def reset_enumerate(thing, start=0):
     x = start
     for t in thing:
         val = yield t, x
         if val is not None:
             x = val
         else:
             x += 1

然后你会像这样使用它:

r = reset_enumerate(range(10))
for i, num in r:
    print('i:', i, 'num:', num)     
    if i == 5:
        i, num = r.send(0)
        print('i:', i, 'num:', num)

答案 1 :(得分:1)

以下是如何模拟像您这样的场景的示例:

假设我有一个名为input.txt的文件,其中包含以下数据:

1
2
3

代码:

j = 0
with open('input.txt', 'r') as f:
    for k in f:
        # A break condition
        # If not we'll face an infinite loop
        if j > 4:
            break
        if k.strip() == '2':
            f.seek(0)
            print("Return to position 0")
            # Don't forget to increment j 
            # Otherwise, we'll end up with an infinite loop
            j += 1
        print(k.strip())

将输出:

1
Return to position 0
2
1
Return to position 0
2
1
Return to position 0
2
1
Return to position 0
2
1
Return to position 0
2

答案 2 :(得分:1)

如评论中所述,enumerate是生成器函数。它完成时就“耗尽”了。这也是为什么你不能只是“重置”它。这是PEP枚举,以进一步解释它是如何工作的。

此外,正如评论中所示,this post提供了处理大文件的典型方法。