38

「DiveintoPython3」で次のように読みました。

「このreadlines()メソッドはイテレータを返すようになったため、Python2の場合と同じように効率的xreadlines()です」。

参照:付録A:2to3を使用したPython 3へのコードの移植:A.26 xreadlines()I/Oメソッド

http://docs.python.org/release/3.0.1/whatsnew/3.0.htmlで言及されていないため、それが正しいかどうかはわかりません。どうすれば確認できますか?

4

3 に答える 3

40

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

Help on built-in function readlines:

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

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

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

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


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

 for line in f.xreadlines():

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

 for line in f:

readlinesこれにより、必要なイテレーターが得られ、Python 3でその動作を変更する必要がなかった理由を説明するのに役立ちます-line in fイディオムが反復アプローチを提供し、長い間廃止されたものxreadlinesが削除された状態で、完全なリストを返すことができます完全に。

于 2010-08-22T11:03:03.793 に答える
27

このような:

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.

>>>
于 2010-08-22T11:03:56.307 に答える
7

他の人はすでに同じように言っていますが、ポイントを家に帰すために、通常のファイルオブジェクトは独自のイテレータです。したがって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)
于 2012-10-27T19:53:21.617 に答える