【问题标题】:Is it possible to prevent iterator from reaching end of file?是否可以防止迭代器到达文件末尾?
【发布时间】:2019-11-12 11:33:34
【问题描述】:

我试图找到这个问题的答案,但我想我无法确定问题的根源。如果这已在其他地方得到解答,如果您能花点时间解释一下我所缺少的,我将不胜感激。

基本上,我认为你可以这样做:

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 的更好方法的评论。

【问题讨论】:

    标签: python loops iterator with-statement


    【解决方案1】:

    这里的缩进是不正确的:它读取一行然后中断然后读取文件的其余部分,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)
    

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

    【讨论】:

    • 感谢让-弗朗索瓦;我在上面发布后不久在上面的示例代码中发现了我自己的错误。我最终浏览了我的真实代码并在几个小时后弄清楚真正的问题是什么,但你发布的内容确实回答了上面的问题。我的问题原来是无关的。
    • 我发布了一个答案,以展示手动迭代文件句柄(或其他任何内容)的更好方法。之后创建一个循环来打破它有点笨拙:) next 并不是那么有名,很遗憾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2020-09-09
    • 2011-01-18
    相关资源
    最近更新 更多