混合file.readline()和file.next()

wnn*_*maw 12 python

我注意到一些奇怪的行为与今天玩弄next()readline().似乎两个函数都产生相同的结果(这是我所期望的).但是,当我混合它们时,我会得到一个ValueError.这是我做的:

>>> f = open("text.txt", 'r')
>>> f.readline()
'line 0\n'
>>> f.readline()
'line 1\n'
>>> f.readline()
'line 2\n'
>>> f.next()
'line 3\n'
>>> f.next()
'line 4\n'
>>> f.readline()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Mixing iteration and read methods would lose data
>>>
>>> f = open("text.txt", 'r')
>>> f.next()
'line 0\n'
>>> f.next()
'line 1\n'
>>> f.next()
'line 2\n'
>>> f.readline()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Mixing iteration and read methods would lose data
Run Code Online (Sandbox Code Playgroud)

那么这里的整体问题是导致此错误的引擎盖下发生了什么?

有些问题可能会得到解答但我希望听到答案,如果不是:

  1. next()和之间有什么区别readline()
  2. 当我做for f in file:哪个功能时,我打电话(并且这是否重要)?
  3. 为什么我可以调用next()readline(),而不是周围的其他方式?

提前致谢,

我不认为这很重要,但是如果这是版本依赖的,我使用的是Python 2.7.6 for Windows

hiv*_*ert 19

根据Python的文档(重点是我的)

文件对象是它自己的迭代器,例如iter(f)返回f(除非f被关闭).当文件用作迭代器时,通常在for循环中(例如,对于f:print line.strip()中的行),将重复调用next()方法.此方法返回下一个输入行,或者在文件打开以供读取时触发EOF时引发StopIteration(当文件打开以进行写入时,行为未定义).为了使for循环成为循环文件行的最有效方式(一种非常常见的操作),next()方法使用隐藏的预读缓冲区.由于使用预读缓冲区,将next()与其他文件方法(如readline())结合使用是行不通的.但是,使用seek()将文件重新定位到绝对位置将刷新预读缓冲区.

next方法从效率原因中读取了所需的更多内容.这打破了readline.所以答案是

  1. next 由于预读而更快
  2. for s in f: 使用 next
  3. 在调用之前next,readline对文件使用标准的慢速读取,这样就没有问题了.