2011-01-06 11 views
420

一度にいくつかのファイルを変更したい場合はiff私はそれらのすべてに書き込むことができます。私は何とかwith文で複数のオープン呼び出しを組み合わせることができます場合、私は思ったんだけど:Pythonで "with open"を使って複数のファイルを開くにはどうしたらいいですか?

try: 
    with open('a', 'w') as a and open('b', 'w') as b: 
    do_something() 
except IOError as e: 
    print 'Operation failed: %s' % e.strerror 

をそれができない場合は、どのようなこの問題へのエレガントな解決策は次のようになりますか? (それぞれ、又は3.1)のPython 2.7のよう

答えて

652

あなたは、Pythonの以前のバージョンで

with open('a', 'w') as a, open('b', 'w') as b: 
    do_something() 

を書くことができ、あなたは、時には巣コンテキストマネージャに contextlib.nested()を使用することができます。ただし、これは複数のファイルを開く場合には期待どおりに機能しません - 詳細についてはリンクされたドキュメントを参照してください。

+0

はい..数行のコードは、同様に、以前のバージョンのPythonでそれをやって許可されていることのようにクール、 http://metapython.blogspot.com/2010/12/multiple-contests-in-with-statement-not.html – jsbueno

+3

残念ながら、contextlib.nestedドキュメントによれば、それを使用しないでください"2番目のファイルを開くときに例外がスローされると、最初のファイルがすぐに閉じられないため、2つのファイルを開くためにnested()を使用するとプログラミングエラーです。" – weronika

+17

は、ファイルの変数リストを開くために 'with'を使う方法はありますか? – monkut

77

だけ,andを交換し、あなたが行っている:

try: 
    with open('a', 'w') as a, open('b', 'w') as b: 
     do_something() 
except IOError as e: 
    print 'Operation failed: %s' % e.strerror 
+0

この構文をサポートするPythonのバージョンを指定する必要があります。 –

31

を一度たり、長いファイルパスの時に多くのファイルを開くためには、複数行の上に物事を破ることは有用である可能性があります。別の答えにコメントで@Sven Marnachによって示唆されているようにPython Style Guideから:文を入れ子

with open('/path/to/InFile.ext', 'r') as file_1, \ 
    open('/path/to/OutFile.ext', 'w') as file_2: 
    file_2.write(file_1.read()) 
2

は、同じ仕事をして、私の意見では、対処する方が簡単であるだろう。

たとえば、inFile.txtがあり、2つのoutFileに同時に書き込むとします。

with open("inFile.txt", 'r') as fr: 
    with open("outFile1.txt", 'w') as fw1: 
     with open("outFile2.txt", 'w') as fw2: 
      for line in fr.readlines(): 
       fw1.writelines(line) 
       fw2.writelines(line) 

EDIT:

私はdownvoteの理由を理解していません。私は自分の答えを公開する前に自分のコードをテストし、それは必要に応じて動作します。質問が尋ねるのと同じように、すべてのoutFileに書き込みます。重複した書き込みも書き込みもしません。だから私は本当に私の答えが間違っているか、次善のようなものかそうでないものと考えられるのかどうか不思議です。 python 2.6で

+1

私は他の誰かがあなたを落としたのか分からないが、これは私が必要としただけの3つのファイル(1つの入力、2つの出力)を持っている唯一の例であるため、あなたをUPした。 –

+0

ありがとう@AdamWood!私が助けることができることを聞いて非常にうれしい。ハッピーホリデー! – FatihAkici

0

それは動作しません、我々は複数のファイルを開くための方法の下に使用する必要があります:

with open('a', 'w') as a: 
    with open('b', 'w') as b: 
関連する問題