2

私はPythonを使用しており、ファイルにアクセスする方法はたくさんあります。

方法1:

fp = open("hello.txt", "w")
fp.write("No no no");
fp.close()

fp = open("hello.txt", "r")
print fp.read()
fp.close()

方法2:

open("hello.txt", "w").write("hello world!")
print open("hello.txt", "r").read()

方法3:

with open("hello.txt","w") as f:
    f.write("Yes yes yes")

with open("hello.txt") as f:
    print f.read()

これらのそれぞれを使用することに特定の利点はありますか?

私が知っているもの:

  • 方法2と方法3はファイルを自動的に閉じますが、方法1は閉じません。
  • 方法2では、複数の操作を実行するためのハンドルは提供されません。
4

3 に答える 3

10

3番目の方法を使用する必要があります。

プログラミングには、設定したオブジェクトを使用し、コードを実行して、再度破棄するという一般的なパターンがあります。ファイルハンドルはこの一例です。ファイルを開き、コードを実行してから、ファイルを閉じる必要があります。これはオプションではありません。オペレーティングシステムがこれで完了したことを認識し、PythonがすべてのデータをIOバッファーからフラッシュすることが重要です。

現在、CPythonは参照カウント言語です。つまり、特定のオブジェクトについて「知っている」コードの数をカウントするため、そのカウントがゼロになると、そのオブジェクトをクリーンアップして、メモリ内のスペースを再利用できます。方法2では、ファイルオブジェクトの参照カウントがゼロになり、Pythonがそれをクリーンアップできるようになります。また、ファイルオブジェクトのクリーンアップメソッドもそれらを閉じます。ただし、一般にこれに依存しないでください。参照カウントはPythonの標準バージョンの実装の詳細であり、プログラムの実行に使用しているものが同じことを行うという保証はありません。そのため、方法2は使用しないでください。

関数呼び出しに到達する限り、ファイルを明示的に閉じるため、方法1の方が適しています。.close()そのコードブロックの途中で例外がスローされた場合、closeに到達せず、ファイルは明示的に閉じられません。したがって、実際には真ん中のコードをtry... finallyブロックでラップする必要があります。

したがって、方法3が最適です。ステートメント(をブロックで囲む慣用的な方法)を使用してwithファイルを閉じるため、の余分な構文上の綿毛について心配する必要はありません。.closefinallytry... except

于 2013-01-11T09:08:30.123 に答える
1

私はこれを使用します、一種の拡張バージョンmethod 3

with open("hello.txt","w+") as f:  
    f.write("Yes yes yes")
    f.seek(0)                  #places the cursor back to the start of the file
    print f.read()             #now read the file

利点:

  1. ファイルを1回だけ開きます
  2. w +モードでは、同じファイルオブジェクトの読み取りと書き込みの両方が可能です
  3. withファイルのクローズを処理します
于 2013-01-11T09:04:56.343 に答える
0

try方法1は明示的であり、aやexcept block方法3で囲むことができるため、方法1を使用するのが最善だと思います。

于 2013-01-11T09:09:37.490 に答える