readlines()在Python 3中返回列表还是迭代器?
我在《深入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.
>>>