-1

ファイル I/O の目的は次のとおりです。

with open

次の代わりに使用する必要があります。

 f=open('file', 'w')
 f.write('foo)'
 f.close()
4

4 に答える 4

8

常に使用してwith statementください。

ドキュメントから:

ファイル オブジェクトを扱うときはwithキーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートの終了後にファイルが適切に閉じられるという利点があります。try-finallyまた、同等のブロックを書き込むよりもはるかに短いです。

ファイルを明示的に閉じないと、ファイル オブジェクトはガベージ コレクトされるまでメモリ内でハングアップする可能性があります。これclose()により、ファイル オブジェクトが暗黙的に呼び出されます。したがって、withエラーが発生した場合でもファイルを明示的に閉じるため、ステートメントを使用することをお勧めします。

関連:参照カウントがゼロになると、ファイル オブジェクトは自動的に閉じますか?

于 2013-11-08T22:31:54.490 に答える
1

はい。with可能な限り使用する必要があります。

これは、コンテキスト マネージャopenとしての戻り値を使用しています。したがって、は特に に使用されるわけではありませんが、(通常はブロックに入れる) オブジェクトに関して何らかのクリーンアップが必要な場合に優先する必要があります。この場合: コンテキストを終了すると、ファイル オブジェクトのメソッドが呼び出されます。withopenfinally.close()

コンテキスト マネージャの「クリーンアップ」のもう 1 つの良い例は、次threadingLockとおりです。

lock = Lock()

with lock:
    #do thing
#lock is released outside the context

この場合、コンテキスト マネージャは.release()ロックを行っています。

__enter__andメソッドを使用するもの__exit__はすべて、コンテキスト マネージャーとして使用できます。または、装飾 を使用contextlibしてコンテキストマネージャーを作成することもできます。詳細はこちら。@contextmanager

于 2013-11-08T22:40:36.557 に答える
0

基本的に回避しようとしているのはこれです:

set things up
try:
    do something
finally:
    tear things down

しかし、withステートメントを使用すると、安全にファイルを開くことができ、withステートメントのスコープを終了するとすぐにファイルが閉じられます。

withステートメントはクラスの関数を呼び出します。__enter__これは初期設定を__exit__行い、最後に関数を呼び出すことを確認します。これにより、すべてが適切に閉じられます。

于 2013-11-08T22:35:30.330 に答える
-1

このwithステートメントは、より堅牢なコードを簡単に作成するためのショートカットです。これ:

with open('file', 'w') as f:
    f.write('foo')

これと同等です:

try:
    f = open('file', 'w')
    f.write('foo')
finally:
    f.close()
于 2013-11-08T22:35:23.603 に答える