【问题标题】:What are the differences among `next(f)`, `f.readline()` and `f.next()` in Python? [duplicate]Python中的`next(f)`、`f.readline()`和`f.next()`有什么区别? [复制]
【发布时间】:2015-11-25 18:04:45
【问题描述】:

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

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:混合迭代和读取方法会丢失数据

因此,我想知道next(f)f.readline()f.next()在Python中的区别?

【问题讨论】:

  • next(iter) 函数调用iter.next(),如果你给next() 第二个参数,它将处理StopIteration 异常。有关next()file.readline() 的详细信息,请参阅骗子。
  • 副本涵盖了相同的想法,这是由于使用readlinenext导致的不一致。但是,这篇文章专门询问了两者之间的“区别”是什么,这与 dup 所要求的不同。其他提出相同问题的人可能会找到这篇文章而不是 dup。此外,接受的答案并没有真正回答问题,因为它没有解释 readline 的作用。

标签: python readfile


【解决方案1】:

引用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 会产生不一致的结果。这就是为什么不允许将它们混合在一起的原因。

【讨论】:

  • 虽然它解决了 OP 遇到的错误,但这并不能真正回答所述问题。它只解释了next() 的工作原理,而不是其他功能。
猜你喜欢
  • 2012-04-14
  • 2016-06-20
  • 2013-01-16
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多