在Python中,f.readlines()和list(f)之间有什么区别

时间:2014-05-30 15:31:10

标签: python list file file-io python-internals

Python2 TutorialPython3 Tutorial开始,第7.2.1节中间有一行说:

  

如果您想阅读列表中文件的所有行,您还可以使用list(f)f.readlines().

所以我的问题是:将文件对象转换为列表的这两种方法有什么区别?我对性能方面和Python对象实现(以及Python2和Python3之间的区别)感到好奇。

1 个答案:

答案 0 :(得分:12)

在功能上,没有区别;两种方法都会产生完全相同的列表。

实现明智的做法是,将文件对象用作iterator(重复调用next(f)直到StopIteration被引发),另一个使用专用方法来读取整个文件。

Python 2和3的含义完全相同,除非你在Python 2中使用io.open()。Python 2文件对象use a hidden buffer for file iteration,如果你混合文件对象迭代和{ {1}}或.readline()来电。

.readlines()库(处理Python 3中的所有文件I / O)不使用这样的隐藏缓冲区,所有缓冲都由BufferedIOBase() wrapper class处理。事实上,io.IOBase.readlines() implementation使用文件对象作为迭代器无论如何TextIOWrapper iteration delegates to TextIOWrapper.readline(),因此iolist(f)基本上是同样的,真的。

性能方面,即使在Python 2中也没有什么区别,因为瓶颈是文件I / O;你能多快从磁盘上读取它。在微观层面,性能可能取决于其他因素,例如操作系统是否已经缓冲了数据以及线路的长度。

相关问题