web-dev-qa-db-ja.com

readlines()はPython 3でリストまたはイテレータを返しますか?

「Dive into Python 3 "」で「readlines()メソッドがイテレータを返すようになりましたので、xreadlines()がPython 2 "。ここを参照してください: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html 。これが本当かどうかはわかりませんが、ここでは言及していません: http://docs.python.org/release/3.0.1/whatsnew/3.0.html 。どうすれば確認できますか?

32
snakile

このような:

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.

>>>
22
John Machin

ReadlinesメソッドはPython 3ではイテレータを返さず、リストを返します

Help on built-in function readlines:

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

確認するには、インタラクティブセッションから呼び出します。イテレータではなくリストが返されます。

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

この場合、Pythonに飛び込むのは間違っているようです。


xreadlinesPython 2. 以降、ファイルオブジェクトが独自のイテレータになったときに非推奨になりました。xreadlinesと同じ効率を得る方法代わりに

 for line in f.xreadlines():

単純に使用する必要があります

 for line in f:

これはあなたが望むイテレータを取得し、readlinesがPython 3でその動作を変更する必要がなかった理由を説明するのに役立ちます-それでも完全なリストを返すことができます。 line in fイディオムは反復的なアプローチを提供し、長く非推奨になったxreadlinesは完全に削除されました。

31
Scott Griffiths

他の人たちはすでに同じように言っていますが、要点を理解するために、通常のファイルオブジェクトは独自のイテレータです。したがって、イテレータをreadlines()で返すことは、呼び出したファイルを返すだけなので、ばかげたことになります。スコットが言ったように、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)
7
Jack O'Connor