2011-01-06 57 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 

如果這是不可能的,你會一個優雅的解決這個問題是什麼樣子?

回答

652

對於Python 2.7(或3.1分別),你可以寫

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

在較早版本的Python,你有時可以用 contextlib.nested()窩上下文管理。這不會按預期的方式打開多個文件 - 詳情請參閱鏈接的文檔。

+0

是..太酷了的幾行代碼允許這樣做,在以前的Python版本爲好,如下例所示:http://metapython.blogspot.com/2010/12/multiple-contests-in-with-statement-not.html – jsbueno 2011-01-06 19:34:50

+3

不幸的是,根據contextlib.nested文檔,您不應該使用它對於文件打開:「使用嵌套()打開兩個文件是一個編程錯誤,因爲如果在打開第二個文件時引發異常,第一個文件將不會及時關閉。」 – weronika 2011-09-01 20:49:16

+17

有沒有辦法使用'with'來打開文件的變量列表? – monkut 2013-04-10 00:29:31

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支持此語法。 – 2014-11-28 03:27:47

31

對於一次或長文件路徑打開多個文件,也可能是多行打破東西是有用的。從Python Style Guide在評論另一個答案建議由@Sven Marnach:

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

嵌套with語句會做同樣的工作,在我看來,是更直接地處理。

假設你有inFile.txt,並且想要將它同時寫入兩個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) 

編輯:

我不瞭解downvote的原因。在發佈我的答案之前,我測試了我的代碼,並且它的工作原理如下:它寫入所有outFile,就像問題所要求的一樣。沒有重複的寫作或寫作失敗。所以我很想知道爲什麼我的答案被認爲是錯誤的,不理想的或類似的。

+1

我不知道別人對你低估了什麼,但我UPVOTED你,因爲這是唯一有三個文件(一個輸入,兩個輸出)的例子,恰好是我所需要的。 – 2017-12-24 00:41:42

+0

謝謝@AdamWood!非常高興聽到我可以提供幫助。節日快樂! – FatihAkici 2017-12-24 19:13:36

0

與Python 2.6將無法正常工作,我們必須使用下面的方法來打開多個文件:

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