2017-11-30 9 views
0

はのは、以下の完全例示のため、文字列を変換foo機能を考えてみましょう:同じ句で2つのコンテキストマネージャを使用してファイルをインプレースで変更することは安全ですか?

def foo(data): 
    ### processes data in a fancy way ### 
    return data.lower() # :P 

それはこのように、場所のファイルを変更する典型的なパターンを交換すると良いでしょう場合、私は思っていましたこの他のいずれかによって

# snippet1 
with open(path, "r") as f: 
    out = foo(f.read()) 

with open(path, "w") as f: 
    f.write(out) 

# snippet2 
with open(path, "r") as f1: 
    out = foo(f1.read()) 
    with open(path, "w") as f2: 
     f2.write(out) 

は、これはすべての可能なシナリオに行うために安全ですか?

関連情報https://www.python.org/dev/peps/pep-0343/

+0

このシナリオでは、コンテキストマネージャーは関係ありません。問題は、1つのファイルに対して2つのハンドルがあることです。 – BartoszKP

答えて

0

これは、コンテキスト管理者の問題ではありません。 2つのコンテキストマネージャーが正常に動作します!問題は次のとおりです。

open("path", "w") 

書き込み用に開くと、ファイルが切り捨てられます。つまり、すべてのデータが削除されます。後で読むと、そのファイルが空であることが示されます。

これは2つのステップで行う必要があります。

+0

私は自分の質問を編集しましたが、前のケースでは申し訳ありませんでしたが、そのケースはばかばかしく無関係です。私の悪いことです:P – BPL

+0

@BPL:編集後、Windowsで動作するかどうかはわかりません。私はテストのために手元にWindowsシステムを持っていません。 –

関連する問題