5

以下の 2 つの方法の行ごとにファイルを読み取る Pythonic の方法は何ですか?

with open('file', 'r') as f:
    for line in f:
        print line

また

with open('file', 'r') as f:
    for line in f.readlines():
        print line

または、私が見逃しているものがありますか?

4

3 に答える 3

11

ファイル ハンドルは独自のイテレータです (具体的には、イテレータ プロトコルを実装します)。

with open('file', 'r') as f:
  for line in f:
    # code

好ましい使用法です。 f.readlines()行のリストを返します。これは、ファイル全体をメモリに吸収することを意味します -> 一般に、特に大きなファイルの場合はお勧めできません。

コンテキスト マネージャーが価値があるという意見に同意し、私のコード例に 1 つ含めたことを指摘しておく必要があります。

于 2012-11-28T03:05:21.953 に答える
7

あなたが提示した2つのうち、1つ目は推奨される練習です。コメントで指摘されているように、コンテキストマネージャーを使用しないソリューション (以下のような) は、ファイルが開いたままになることを意味します。これは悪い考えです。

ぶら下がっているファイルハンドルを残す元の回答に従うべきではありませんfただし、行を読み取る以外の目的で 必要がない場合は、次のようにできます。

for line in open('file', 'r'):
    print line
于 2012-11-28T03:05:15.227 に答える
1

.readlines()メソッドを呼び出す必要はありません。

PLUS:ステートメント付きについて

withステートメントの実行動作は以下のとおりです。

with open("xxx.txt",'r') as f:    
                                  // now, f is an opened file in context
    for line in f:
        // code with line

pass                              // when control exits *with*, f is closed
print f                           // if you print, you'll get <closed file 'xxx.txt'>
于 2012-11-28T04:06:01.017 に答える