2

Python ファイル タイプのドキュメントではfile.closed

ファイル オブジェクトの現在の状態を示すブール値。これは読み取り専用の属性です。close()メソッドは値を変更します。すべてのファイルのようなオブジェクトで使用できるわけではありません。

すべてのファイルのようなオブジェクトで使用できることが保証されていないことを考えると、ファイルを再度開く前に、ファイルを既に開いているかどうかを確認する別の (より良い?) 方法はありますか?

4

2 に答える 2

5

によって返されるすべてのファイル オブジェクトにopenは、closed属性があります。

ファイルのようなオブジェクトは、file(たとえば)と同じインターフェースを実装するオブジェクトであり、引用したドキュメントは、そのようなインターフェースを実装するために属性StringIO.StringIOを持つ必要がないことを示しています。closed

同じドキュメントには、どのファイルのようなオブジェクトにどのメソッドを実装する必要があるかについてのメモが散りばめられています。また、属性について次のように述べています。

ファイル オブジェクトは、他にも多くの興味深い属性を提供します。これらはファイルのようなオブジェクトには必要ありませんが、特定のオブジェクトにとって意味がある場合は実装する必要があります。

close メソッドのドキュメントには、「ファイルを開く必要がある操作はすべて ValueError を発生させる」と記載されているため、ファイルのようなオブジェクトが閉じられているかどうかを確認する最善の方法は、ファイルが開いているかのように単純に使用することです。ValueErrorそうでない場合はキャッチします。

try:
    mystr = f.read(42)
except ValueError:
    # f was closed, do whatever needs doing

すべてのファイルのようなオブジェクトが可能であるとはseek限らないため、オブジェクトが閉じているかどうかを確認するためにテスト読み取りを行うことは (最初に提案したように) 悪い考えです。これは、ファイルが開いていることが判明した場合に備えて、読み取ったものを保存し、それが発生したときに実際の読み取りの先頭に追加する必要があるためです。ファイルが開いていると仮定して、やりたいことをすぐに実行してから、except 句で閉じたファイルを処理する方がよいでしょう。

コメントで指摘されているように、閉じたファイルのようなオブジェクトを単純に再度開くわけではありません。このStringIO例では、閉じると実際にバッファーが削除されるため、ファイルのようなオブジェクトには、閉じる前に使用されていたように、それ自体を「再度開く」ために必要な情報がなくなります。

于 2012-08-08T07:02:49.523 に答える
0

@lazyr がすでに言ったことを明確にするために、ドキュメントはファイルのようなオブジェクトを参照しています。実際のファイルオブジェクトには常にclosed属性があり、それを使用してファイルが閉じているかどうかを確認できます。

于 2012-08-08T07:09:08.557 に答える