¿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?
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.
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
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())
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.
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:
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