繁体   English   中英

Python生成器和文件对象

[英]Python generator and file object

我有关于生成器和文件对象的问题。

如果我写代码

def iter(ls):
    count=0
    for k in ls:
        if count==2:
            break
        count+=1
    for k in ls:
        yield k

test=[1,2,3,4]

k=iter(test)
for i in k:
    print i

然后输出是

1 2 3 4

是的,我可以理解这一点,因为此代码中的break语句不会影响以下yield语句。

但是如果我对文件执行类似的操作,在这种情况下,我会创建一个“数据”文件并将其写入

1
2
3
4

如果我只改变线

test=[1,2,3,4]  →  test=open("data","r")

然后结果是

4

这意味着break语句以某种方式影响,因此for循环中的genetor“yield”与前一种情况不同。

造成这种差异的原因是什么?

是的,因为文件对象也存储了当前读取的位置。 因此,当您尝试再次迭代文件对象时(不执行.seek() ),它将从下一行(您离开的位置)开始。 那是在打开文件并迭代一次之后,如果你再次尝试迭代它(不做.seek() ),它就不会产生任何结果,因为在第一次迭代中光标位于文件的末尾而且没有别的东西可读。 示例 -

我的a.txt -

1
2
3
4

代码 -

>>> for i in f:
...     print(i)
...
1

2

3

4
>>> for i in f:
...     print(i)
...
>>>

-

如上所述,如果要将文件光标移动到文件的开头,则必须使用file.seek(0) ,0表示移动起始位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM