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

时间:2014-03-04 18:26:25

标签: 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

所以这里的整体问题是导致此错误的内幕发生了什么?

有些问题可能会得到解答,但如果没有,我想听听答案:

  1. next()readline()之间有什么区别?
  2. 当我做for f in file:我打电话给哪个功能时(并且有关系)?
  3. 为什么我可以在next()之后致电readline(),而不是相反?
  4. 提前致谢,

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

1 个答案:

答案 0 :(得分:19)

根据Python's doc(强调是我的)

  

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

由于效率原因,next方法会读取更多内容。这打破了readline。 所以答案是

    由于预读,
  1. next速度更快
  2. for s in f:使用next
  3. 在调用next之前,readline对文件使用标准慢速读取,因此没有问题。