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

时间:2015-11-25 18:04:46

标签: python readfile

我处理一个文件:跳过标题(注释),处理第一行,处理其他行。

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)

如果line = next(f)line = f.readline()替换,则会遇到错误。

  

ValueError:混合迭代和读取方法会丢失数据

因此,我想知道Python中next(f)f.readline()f.next()之间的差异?

1 个答案:

答案 0 :(得分:3)

引用official Python documentation

  

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

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