私は使用方法を学んopen(file, 'r')
でいて、疑問に思っていました:
私が言っopen(file1, 'r')
た後、もう一度同じファイルにアクセスしようとするopen()
と、うまくいきますか? 私はclose()
それをしたことがないからです。また、変数に割り当てられていないため、開いた直後に閉じますか?
cpython ではopen()
、結果を変数に代入せずに使用すると、すぐにファイルが閉じられます。他の Python 実装 (IronPython、jython など) では、これは当てはまらない場合があります。のファイル オブジェクトは、明示的に閉じていない場合、ガベージ コレクターによって削除されると閉じられます。
ただし、ファイルを複数回開くことができるためopen()
、ファイルを開いているかどうかに関係なく、後で同じファイル名をいつでも渡すことができます。
with
通常は、ステートメントを使用して、開いているファイルをコンテキスト マネージャーとして使用することをお勧めします。ステートメントの下にインデントされたコード ブロックwith
が完了すると、ファイルは自動的に閉じられます。
with open(filename, 'r') as f:
# Do things with f
# f is automatically closed
ファイルを閉じるか、Python プロセスが停止するまで、ファイルは開いたままになります。再度開くことはできますが、完了したら閉じてください。
これを行う最善の方法は、open を with ステートメント コンテキスト マネージャーとして使用することです。
with open("file", 'r') as f:
# do stuff
コードが with ブロックを離れると、ファイルは自動的に閉じられます。実際には、例外が発生してコードがブロックを離れてもファイルが閉じられるため、それよりもさらに優れています。もちろん、を使用してファイルを閉じることもできますfile.close()
。
ファイルが大きくなりすぎないことがわかっていて、それを読み取ることだけが目的の場合、一般的なイディオムは、ファイル全体をメモリにロードすることであり、その後はファイル ハンドルを忘れることができます。例えば:
with open("file", 'r') as f:
text = f.read()
ファイルが存在するかどうかを確認するには、次を使用しますos.path.exists
。
import os
os.path.exists("file")
よく理解できたかわかりませんが、open() を使用して、ファイル ストリームを表すオブジェクトを作成します。このオブジェクトへの参照を維持するまで、ファイル ストリームが開かれます。しかし、同じファイルに対して再度 open() を呼び出すと、ファイル ストリームを表す別のオブジェクトが作成されます。ストリームのターゲットは同じですが、オブジェクトは異なります。
ガベージ コレクターが Java と同じように Python で機能するかどうかはわかりませんが、そうであれば、参照によって指されていないすべてのオブジェクトがメモリから削除されます。「すぐに」ではなく、ガベージコレクターがいつ実行されるかは予測できません。今かもしれませんし、数秒後かもしれません。