¿Cómo puedo abrir varios archivos usando" with open " en Python?


Quiero cambiar un par de archivos a la vez, iff Puedo escribir a todos ellos. Me pregunto si de alguna manera puedo combinar las múltiples llamadas abiertas con la instrucción with:

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, ¿cómo sería una solución elegante a este problema?

Author: Martin Thoma, 2011-01-06

5 answers

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

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

En versiones anteriores de Python, a veces puede usar contextlib.nested() para anidar a los gestores de contexto. Sin embargo, esto no funcionará como se espera para abrir archivos múltiples see consulte la documentación vinculada para obtener más detalles.

 743
Author: Sven Marnach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 23:30:43

Simplemente reemplaza and con , y listo:

try:
    with open('a', 'w') as a, open('b', 'w') as b:
        do_something()
except IOError as e:
    print 'Operation failed: %s' % e.strerror
 85
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-06 16:20:42

Para abrir muchos archivos a la vez o para rutas de archivo largas, puede ser útil dividir las cosas en varias líneas. De la Guía de Estilo de Python como sugirió @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())
 37
Author: Michael Ohlrogge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-25 19:44:03

Anidado con declaraciones hará el mismo trabajo, y en mi opinión, son más fáciles de tratar.

Digamos que tienes inFile.txt, y quiere escribirlo en dos outFile simultáneamente.

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)

EDITAR:

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

 7
Author: FatihAkici,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 22:57:11

Con python 2.6 no funcionará, tenemos que usar la siguiente manera para abrir varios archivos:

with open('a', 'w') as a:
    with open('b', 'w') as b:
 3
Author: Aashutosh jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-02 05:38:54