我在“潜入 Python 3”中读到:
“该方法现在返回一个迭代器,因此它与 Python 2
readlines()
中的效率一样高”。xreadlines()
请参阅:附录 A:使用 2to3 将代码移植到 Python 3:A.26 xreadlines() I/O 方法。
我不确定这是不是真的,因为他们在这里没有提到:http: //docs.python.org/release/3.0.1/whatsnew/3.0.html。我该如何检查?
我在“潜入 Python 3”中读到:
“该方法现在返回一个迭代器,因此它与 Python 2
readlines()
中的效率一样高”。xreadlines()
请参阅:附录 A:使用 2to3 将代码移植到 Python 3:A.26 xreadlines() I/O 方法。
我不确定这是不是真的,因为他们在这里没有提到:http: //docs.python.org/release/3.0.1/whatsnew/3.0.html。我该如何检查?
在 Python 3 中 readlines 方法不返回迭代器,它返回一个列表
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 以来,当文件对象成为它们自己的迭代器时,它已被弃用。获得与 is 相同效率的方法,xreadlines
而不是使用
for line in f.xreadlines():
for line in f:
这将为您提供所需的迭代器,并有助于解释为什么readlines
不需要更改其在 Python 3 中的行为 - 它仍然可以返回完整列表,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)