是否可以防止迭代器到达文件末尾?
Is it possible to prevent iterator from reaching end of file?
我试图找到这个问题的答案,但我想我无法真正查明问题的根源。如果此问题已在其他地方得到解答,请您花点时间解释一下我遗漏的内容,我将不胜感激。
基本上,我认为你可以这样做:
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 的更好方法的评论。
此处的缩进不正确:先读取一行然后中断然后读取文件的其余部分,共 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
但会产生一个默认值(你忽略)
我试图找到这个问题的答案,但我想我无法真正查明问题的根源。如果此问题已在其他地方得到解答,请您花点时间解释一下我遗漏的内容,我将不胜感激。
基本上,我认为你可以这样做:
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 的更好方法的评论。
此处的缩进不正确:先读取一行然后中断然后读取文件的其余部分,共 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
但会产生一个默认值(你忽略)