在 Python 中,f.readlines() 和 list(f) 有啥区别

Posted

技术标签:

【中文标题】在 Python 中,f.readlines() 和 list(f) 有啥区别【英文标题】:In Python, what is the difference between f.readlines() and list(f)在 Python 中,f.readlines() 和 list(f) 有什么区别 【发布时间】:2014-07-20 10:13:38 【问题描述】:

从Python2 Tutorial 和Python3 Tutorial 来看,第 7.2.1 节的中点有一条线:

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

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

【问题讨论】:

【参考方案1】:

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

在实现方面,一个使用文件对象作为iterator(重复调用next(f),直到引发StopIteration),另一个使用专用方法读取整个文件。

Python 2 和 3 的含义完全不同,除非您在 Python 2 中使用 io.open()。Python 2 文件对象 use a hidden buffer for file iteration,如果您将文件对象迭代和 .readline() 或 @ 混合使用,这可能会让您感到困惑987654331@ 电话。

io 库(在 Python 3 中处理所有文件 I/O)不使用这种隐藏缓冲区,而是由 BufferedIOBase() wrapper class 处理所有缓冲。事实上,io.IOBase.readlines() implementation 使用文件对象作为引擎盖下的迭代器无论如何,而TextIOWrapper iteration delegates to TextIOWrapper.readline(),所以list(f)f.readlines() 本质上是一回事,真的。

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

【讨论】:

以上是关于在 Python 中,f.readlines() 和 list(f) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Python 之读取大文件readline与readlines的差别

python面试总结

python-文件读写

python-文件读写

python 之路 day9

Python 文件操作二