1

私は頻繁に以下の2つの関数を使用して、ファイルの内容を文字列に読み取り、文字列をファイルに書き込みます。私の知る限り、これらの関数はPython標準ライブラリには存在しないので、その理由に興味があります。高レベルのディレクトリとファイル操作を備えた標準ライブラリモジュールshutilにはこの機能がありません。これは、そこにないという明示的な設計上の選択だったと思います。つまり、私は次のことを知りたいです:

  • Python標準ライブラリに含まない潜在的な理由は何ですか
  • この方法でファイルを処理することの欠点はありますか(ファイルの内容全体がメモリにロードされることを認識していると仮定します)

関数

def read_file(path):
    with open(path) as f:
        return f.read()

def write_file(path, data):
    with open(path, 'wb') as f:
        return f.write(data)

明確にするために、私は以下がより読みやすいと思います

write_file('/tmp/test', 'test')

次に、以下の2つの選択肢があります。

open('/tmp/test', 'wb').write('test')

with open('/tmp/test', 'wb') as f:
    f.write(data)
4

2 に答える 2

5

これらはどちらもワンライナーであり、実際には関数は必要ありません。

data = open("filename").read()
open("filename", "w").write(data)

少なくとも CPython では、ファイル オブジェクトへの参照を保持していないため、これらのステートメントのいずれかを実行した直後にファイルが閉じられます。特に単純なスクリプトでは、例外が発生したときにファイルが閉じられることを確認することは実際には問題ではありません。

Jython や IronPython などの他の Python 実装では、これはより問題になる可能性があります。ある場合は、次のwithようになります (1 行で完全に明確に記述することもできます)。

with open("filename") as f: data = f.read()

あなたが書いたようなヘルパー関数を持っている方が明確である場合は、ぜひそれらを書いてください。それらは十分に明確です。しかし、それらはほとんど必要なく、ほとんどの Python プログラマーはそれらを使用しません。

于 2012-10-09T16:44:27.443 に答える
2

@Kindallの回答のようなワンライナーで両方が可能であることを除けば...

あなたの例は多くのオプションを渡し、特定のタスクのためにそれらをレンダリングします。

def read_file(path):
    with open(path) as f:
        return f.read()

Open はいくつかの引数を取ります。 http://docs.python.org/library/functions.html#open

open(名前[、モード[、バッファリング]])

ファイルを複数の方法で読み取ることもできます。

ファイルのサイズ、コンテンツの種類、およびファイルで何をしたいかによって、物事を切り替えたいと思うでしょう。

あなたが書いたような「read()」と「write()」関数を持つことは、小さなテキストファイルを扱うのに役立ちますが、他の状況では面倒になる可能性があります.

たとえば、9 GB のログ ファイルを読み込もうとしている場合 - あなたのアイデアですべてをメモリに読み込むと、ほとんどの最新のマシン (4 ~ 8 GB の RAM を搭載) で多くの問題が発生します。そのログファイルがバイナリ形式の場合、データの操作に問題が発生します。

これらのコマンドをチェーンすることにより、ワンライナーで簡単にファイルを読み書きできるため、ファイルを処理するための別の、より制限された方法を使用することはほとんど意味がありません。

于 2012-10-09T17:17:58.540 に答える