代码如下:
f=open('test.txt')
file=iter(f)
当我这样做
next(file)
它将逐行打印文件。 但是当我修改test.txt文件并保存后,next(file)仍然打印原始文件内容。
迭代器是否将完整文件存储在内存中? 如果不是,为什么文件内容没有更新?
答案 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()
实际上没有读取文件。