readlines()在Python 3中返回列表还是迭代器?

41 投票
3 回答
40500 浏览
提问于 2025-04-16 03:08

我在《深入Python 3》这本书里看到:

readlines() 方法现在返回一个迭代器,所以它的效率和Python 2里的xreadlines()一样高。”

你可以查看这个链接了解更多信息:附录A:使用2to3将代码迁移到Python 3:A.26 xreadlines() I/O方法

我不太确定这个说法是否正确,因为在这里没有提到:http://docs.python.org/release/3.0.1/whatsnew/3.0.html。我该怎么确认呢?

3 个回答

7

其他人已经说过类似的话,但我再强调一下,普通的文件对象本身就是一个迭代器。所以让readlines()返回一个迭代器是没必要的,因为它只会返回你调用它的那个文件。就像Scott说的,你可以用for循环来遍历一个文件,你也可以直接把文件传给itertools的一些函数:

from itertools import islice
f = open('myfile.txt')
oddlines = islice(f, 0, None, 2)
firstfiveodd = islice(oddlines, 5)
for line in firstfiveodd:
  print(line)
44

在Python 3中,readlines方法返回的是一个列表,而不是一个迭代器。

Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

你可以在交互式会话中调用它,看看它返回的是列表,而不是迭代器:

>>> type(f.readlines())
<class 'list'>

在这种情况下,《Dive into Python》似乎是错的。


xreadlines自从Python 2.3开始就被淘汰了,因为文件对象现在可以自己作为迭代器。要获得和xreadlines一样的效率,你应该使用

 for line in f.xreadlines():

简单地使用

 for line in f:

这样你就能得到你想要的迭代器,这也解释了为什么readlines在Python 3中不需要改变它的行为——它仍然可以返回一个完整的列表,而line in f这种写法则提供了迭代的方式,已经被彻底淘汰的xreadlines也被完全移除了。

28

像这样:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('/junk/so/foo.txt')
>>> type(f.readlines())
<class 'list'>
>>> help(f.readlines)
Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

    hint can be specified to control the number of lines read: no more
    lines will be read if the total size (in bytes/characters) of all
    lines so far exceeds hint.

>>>

撰写回答