Dive Into Python 3でこのイディオムを見てきました:
l = list(open('strcpy.c'))
問題は、どうすればclose
ファイルを取得できるかということです。
舞台裏で何かが起こっていますか?
この情報は本では見つけられませんでした。
Dive Into Python 3でこのイディオムを見てきました:
l = list(open('strcpy.c'))
問題は、どうすればclose
ファイルを取得できるかということです。
舞台裏で何かが起こっていますか?
この情報は本では見つけられませんでした。
オブジェクトがガベージ コレクションされると、ファイルは閉じられます。CPython では、ファイルが変数に割り当てられることはないため、これはその行が実行された直後に発生します。Jython や IronPython などの他の Python では、プロセスが終了すると、開いているすべてのファイルが常に閉じられますが、これはすぐには発生しない (またはまったく発生しない) 場合があります。
このため、「with」を使用して明示的にファイルを閉じることをお勧めします。
with open("strcpy.c") as infile:
l = list(infile)
これの利点は、読み取り中に例外が発生した場合でも、ファイルが適切に閉じられることです。この場合、try/except
ブロックを使用して手動でコードを記述する必要はありません。
簡潔なwith
ワンライナーを使いたい場合は、ステートメントを 1 行で書くことができます。:-)
とは言うものの、私は時々、実行時間の短いスクリプトでこのイディオムを自分で使用します。厳密に必要な時間よりも少し長くファイルを開くことは大したことではありません。infile
利点は、閉じたファイルを指す変数 (この場合) で混乱しないことです。
ドキュメントから:
ファイル オブジェクトを扱うときは with キーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートの終了後にファイルが適切に閉じられるという利点があります。
次のように使用できます。
with open('strcpy.c') as f:
l = list(f)
個人的には、コンテキスト マネージャーなしでファイルを開くことはありません。
with open('strcpy.c') as myfile:
l = list(myfile)
# do stuff with l here
コンテキスト マネージャーを使用すると、ファイルはインデント ブロックの最後で自動的に閉じられます。