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

YaO*_*OzI 9 python file-io file list python-internals

Python2教程Python3教程中,在7.2.1节的中点都有一行说:

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

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

Mar*_*ers 12

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

实现方面,一个使用文件对象作为迭代器(next(f)重复调用直到StopIteration被引发),另一个使用专用方法来读取整个文件.

除非你io.open()在Python 2中使用,否则Python 2和3的含义完全不同.Python 2文件对象使用隐藏缓冲区进行文件迭代,如果你混合文件对象迭代和/ .readline().readlines()调用,它可能会让你失望.

io库(其处理所有的文件I/O在Python 3)不使用这样的隐藏缓冲器,所有缓冲代替由一个处理BufferedIOBase()包装类.事实上,io.IOBase.readlines()实现使用文件对象作为引擎盖下一个迭代无论如何,和TextIOWrapper迭代代表们TextIOWrapper.readline(),所以list(f)f.readlines()本质上是一样的,真的.

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