在Python中,`next(f)`, `f.readline()`和`f.next()`有什么区别?

3

我处理一个文件: 跳过开头的注释, 处理第一行, 处理其他行.

f = open(filename, 'r')

# skip the header
next(f)  

# handle the first line
line =  next(f)  
process_first_line(line)

# handle other lines
for line in f:
    process_line(line)

If line = next(f) 被替换为 line = f.readline(), 将会遇到以下错误:

ValueError: 混合使用迭代和读取方法将丢失数据

因此,我想了解Python中 next(f), f.readline()f.next() 三者之间的区别是什么?


next(iter) 函数调用 iter.next(),并且如果你给 next() 一个第二个参数,它会处理 StopIteration 异常。有关 next()file.readline() 的详细信息,请参见重复项。 - Martijn Pieters
重复的帖子涵盖了相同的观点,即使用readlinenext导致的不一致性。然而,这篇帖子特别询问了这两者之间的“区别”,这与重复的帖子所问的不同。其他人提出相同问题时可能会找到这篇帖子而不是重复的帖子。此外,被接受的答案并没有真正回答这个问题,因为它没有解释readline的作用。 - orodbhen
1个回答

3

引用官方Python文档

file对象是自己的迭代器,例如iter(f)返回f(除非f已关闭)。当文件用作迭代器时,通常在for循环中(例如for line in f:print line.strip()),将重复调用next()方法。该方法返回下一行输入,或者在打开文件进行读取时遇到EOF时引发StopIteration(当文件用于写入时,行为未定义)。为了使for循环成为循环文件行的最有效方式(这是非常常见的操作),next()方法使用了一个隐藏的预读缓冲区。由于使用了预读缓冲区,将next()与其他文件方法(如readline())组合使用会出现问题。

基本上,当在Python文件对象上调用next函数时,它会从文件中获取一定数量的字节并处理它们,并仅返回当前行(当前行的结尾由换行符确定)。因此,文件指针会被移动。它不会停留在当前返回行的结束位置。因此,在其上调用readline将会给出不一致的结果。这就是为什么不允许同时使用它们的原因。


4
虽然它解决了OP遇到的错误,但它并没有真正回答所述的问题。它仅解释了next()函数的工作原理,而未涉及其他函数。 - orodbhen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接