我注意到今天有一些奇怪的行为在玩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
所以这里的整体问题是导致此错误的内幕发生了什么?
有些问题可能会得到解答,但如果没有,我想听听答案:
next()
和readline()
之间有什么区别?for f in file:
我打电话给哪个功能时(并且有关系)?next()
之后致电readline()
,而不是相反?提前致谢,
我认为这不重要,但如果这是版本相关的,我使用的是Python 2.7.6 for Windows
答案 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
。
所以答案是
next
速度更快for s in f:
使用next
next
之前,readline
对文件使用标准慢速读取,因此没有问题。