2011-01-06 12 views
420

Voglio cambiare un paio di file contemporaneamente, iff Posso scrivere su tutti. Mi chiedo se in qualche modo posso combinare le molteplici inviti aperti con la dichiarazione with:Come posso aprire più file usando "with open" in Python?

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 

Se questo non è possibile, quale sarebbe una soluzione elegante a questo problema simile?

risposta

652

Come di Python 2.7 (o 3.1 rispettivamente) è possibile scrivere

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

Nelle versioni precedenti di Python, a volte è possibile utilizzare contextlib.nested() al contesto manager nido. Ciò non funzionerà come previsto per l'apertura di file multipli, tuttavia - consultare la documentazione collegata per i dettagli.

+0

Sì .. così fresco che poche righe di codice consentono di farlo nelle versioni precedenti di Python pure, come in questo esempio qui: http://metapython.blogspot.com/2010/12/multiple-contests-in-with-statement-not.html – jsbueno

+3

Sfortunatamente, secondo i documenti contextlib.nested, non dovresti usarlo per l'apertura di file: "l'utilizzo di nested() per aprire due file è un errore di programmazione poiché il primo file non verrà chiuso immediatamente se viene generata un'eccezione quando si apre il secondo file." – weronika

+17

c'è un modo per usare 'with' per aprire un elenco di file variabili? – monkut

77

Basta sostituire and con , e il gioco è fatto:

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

Devi specificare quali versioni di Python supportano questa sintassi. –

31

Per l'apertura di molti file in una sola volta o per i percorsi di file lunghi, può essere utile per rompere le cose su più righe. Dal Python Style Guide come suggerito da @Sven Marnach nei commenti a un'altra risposta:

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

nidificato con affermazioni farà lo stesso lavoro, e, a mio parere, sono più semplici da affrontare.

Diciamo che hai inFile.txt e vuoi scriverlo in due file outFile contemporaneamente.

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:

non capisco il motivo della downvote. Ho provato il mio codice prima di pubblicare la mia risposta, e funziona come desiderato: Scrive su tutti i file di outFile, proprio come chiede la domanda. Nessuna scrittura duplicata o mancanza di scrittura. Quindi sono davvero curioso di sapere perché la mia risposta è considerata sbagliata, subottimale o qualcosa del genere.

+1

Non so che cosa qualcun altro ha downvoted di te, ma ho UPVOTED te perché questo è l'unico esempio che aveva tre file (un input, due output) che è stato proprio quello che mi serviva. –

+0

Grazie a @AdamWood! Molto felice di sapere che potrei aiutare. Buone vacanze! – FatihAkici

0

con Python 2.6 Non funzionerà, dobbiamo usare sotto modo per aprire più file:

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