Python修改可变迭代器

时间:2018-09-13 04:52:26

标签: python iterator generator

代码如下:

f=open('test.txt')
file=iter(f)

当我这样做

next(file)

它将逐行打印文件。 但是当我修改test.txt文件并保存后,next(file)仍然打印原始文件内容。

迭代器是否将完整文件存储在内存中? 如果不是,为什么文件内容没有更新?

2 个答案:

答案 0 :(得分:2)

否,作为file对象的迭代器,该对象仅在内存中存储一​​个超前缓冲区,而不存储整个文件。这样可以有效处理大型文件。

由于存在该超前缓冲区,因此对该文件所做的更改将不会反映到next方法中。但是,您可以使用seek方法清除此缓冲区,以便对next方法的下一次调用将返回更新的内容:

f.seek(f.tell()) # seek the current position only to clear the look-ahead buffer
print(next(f)) # prints the updated next line from the current position

答案 1 :(得分:1)

让我们假设open()一次读取2个字母。 (实际值为io.DEFAULT_BUFFER_SIZE

f=open('test.txt')

您已经创建了一个文件对象_io.TextIOWrapper,它过于简化了,类似于[{read from 0 to io.DEFAULT_BUFFER_SIZE of test.txt}, ...}

file=iter(f)

您已经使用以下数据创建了_io.TextIOWrapper的迭代器:[{read from 0 to 1}, ... {read from n-1 to n}]

next(file)

next()浏览了file的第一项,阅读并打印。

让我们学习一个例子。

正常阅读

test.txt

what a beautiful day

我们将打开文件,iter()和list()以打开并遍历所有文件并创建一个列表。

In [1]: f = open('test.txt')

In [2]: list(iter(f))
Out[2]: ['what a beautiful day']

正如预期的那样。

文件在open()之后发生变化

In [1]: f = open('test.txt')

我们已打开文件。

我们现在将hello open()附加到test.txt。

test.txt

what a beautiful day

hello open()

然后是iter()和list()。

In [2]: list(iter(f))
Out[2]: ['what a beautiful day\n', '\n', 'hello open()']

可以看到更改的内容。我们可以看到open()实际上没有读取文件。

文件在iter()之后发生变化

In [1]: f = open('test.txt')

In [2]: i = iter(f)

我们已经打开文件并iter() d。

我们现在将附加hello iter()

test.txt

what a beautiful day

hello open()

hello iter()

然后列出()它。

In [3]: list(i)
Out[3]: ['what a beautiful day\n', '\n', 'hello open()\n', '\n', 'hello iter()']

可以看到更改的内容。我们还可以看到iter()实际上没有读取文件。