2011-01-06 20 views
420

Quiero cambiar un par de archivos al mismo tiempo, iff Puedo escribir en todos ellos. Me pregunto si de alguna manera puedo combinar las múltiples llamadas abiertas con la declaración with:¿Cómo puedo abrir varios archivos usando "con abierto" en 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 

Si eso no es posible, lo que sería una solución elegante a este problema parece?

Respuesta

652

A partir de Python 2.7 (o 3.1 respectivamente) se puede escribir

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

En versiones anteriores de Python, a veces se puede utilizar contextlib.nested() a gestores de contexto nido. Sin embargo, esto no funcionará como se esperaba para abrir archivos múltiples: consulte la documentación vinculada para obtener más información.

+0

Sí .. tan fresco que unas pocas líneas de código permiten hacer que en las versiones anteriores, así pitón, como en este ejemplo aquí: http://metapython.blogspot.com/2010/12/multiple-contests-in-with-statement-not.html – jsbueno

+3

Desafortunadamente, de acuerdo con los documentos contextlib.nested, no debe usarlo para abrir archivos: "usar anidado() para abrir dos archivos es un error de programación, ya que el primer archivo no se cerrará de inmediato si se produce una excepción al abrir el segundo archivo". – weronika

+17

¿hay alguna manera de usar 'with' para abrir una lista variable de archivos? – monkut

77

Basta con sustituir and con , y ya está:

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

Debe especificar qué versiones de Python admiten esta sintaxis. –

31

Para abrir muchos archivos a la vez o de rutas de archivos largos, puede ser útil para romper cosas a lo largo de varias líneas. Desde el Python Style Guide como sugiere @Sven Marnach en comentarios a otra respuesta:

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

anidada con los estados van a hacer el mismo trabajo, y en mi opinión, son más fáciles de tratar.

Digamos que tiene inFile.txt y desea escribirlo en dos archivos de forma simultánea.

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:

No entiendo la razón de la downvote. Probé mi código antes de publicar mi respuesta, y funciona como se desea: se escribe en todos los archivos de OutFile, tal como lo hace la pregunta. No hay escritura duplicada o no se puede escribir. Así que tengo mucha curiosidad por saber por qué mi respuesta se considera incorrecta, subóptima o algo por el estilo.

+1

no sé lo que alguien más le bajó la calificación, pero LE AJUSTE porque este es el único ejemplo que tenía tres archivos (uno de entrada, dos de salida) que resultó ser justo lo que necesitaba. –

+0

Gracias @ AdamWood! Muy contento de escuchar que podría ayudar. ¡Felices vacaciones! – FatihAkici

0

con Python 2.6 No va a trabajar, tenemos que utilizar más adelante manera de abrir varios archivos:

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