在 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) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章