是否可以防止迭代器到达文件末尾?

时间:2019-07-01 20:20:50

标签: python loops iterator with-statement

我试图找到该问题的答案,但我想我无法真正查明问题的根源。如果您在其他地方已回答过此问题,那么请您抽出一点时间来解释我所缺少的内容。

基本上,我认为您可以执行以下操作:

ref = open(ref_file)
with ref:
    for row in ref:
         break

with ref:
    for row in ref:
        print(row)

由于我在第一个循环中使用了break语句,所以我认为它会停止迭代器,暂停读取文件,然后在第二个循环中停下来。事实并非如此-相反,它向我抛出一个错误,说我正在尝试处理已关闭的文件。我进行了推理,得出的结论是,也许with语句才是将迭代器推向EOF的原因。所以我尝试了这个:

with ref:
    for row in ref:
         break

    for row in ref:
        print(row)

这似乎按预期工作。太棒了所以,我接下来尝试的是:

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)

从本质上讲,我期望的是打印交替的行,直到0,10的范围用尽为止。相反,我打印文件的第二行,然后停止。

是否有更好的方法来防止迭代器到达EOF?我想念什么?我是否以某种方式脱离了with语句并错过了要点?

编辑:

好的,最后一个例子并不是我所遇到的问题的例证。

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)
            break

这可以按预期工作……这确实让我觉得我在我的真实代码中缺少了一些东西。对于阻止迭代器到达EOF的更好方法的评论,我仍将不胜感激。

1 个答案:

答案 0 :(得分:2)

此处的缩进是不正确的:它读取一行,然后中断然后读取文件的其余部分,共10次:

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)

请注意,您可以使用next手动进行迭代,而不必脱离for循环。更多pythonic:

for _ in range(10):
    next(vcf,None)

# unindent here
for row in vcf:
    print(row)

None中的next参数可确保即使文件少于10行,它也不会引发StopIteration而是产生默认值(您忽略了)