繁体   English   中英

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

[英]Does readlines() return a list or an iterator in 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 我该如何检查?

readlines 方法在 Python 3 中不返回迭代器,它返回一个列表

Help on built-in function readlines:

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

要检查,只需从交互式会话中调用它 - 它会返回一个列表,而不是一个迭代器:

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

在这种情况下,深入 Python 似乎是错误的。


当文件对象成为它们自己的迭代器时, xreadlines自 Python 2.3 起已被弃用 获得与xreadlines相同效率的方法是,而不是使用

 for line in f.xreadlines():

你应该简单地使用

 for line in f:

这为您提供了您想要的迭代器,并有助于解释为什么readlines不需要在 Python 3 中改变其行为——它仍然可以返回一个完整的列表, line in f idiom 中的line in f给出了迭代方法,以及长的——已弃用的xreadlines已完全删除。

像这样:

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.

>>>

其他人已经说了这么多,但只是为了说明问题,普通文件对象是它们自己的迭代器。 所以让readlines()返回一个迭代器是愚蠢的,因为它只会返回你调用它的文件。 您可以使用for循环来迭代文件,就像 Scott 所说的那样,您也可以将它们直接传递给 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM