如何在Python中使用"with open"打开多个文件?
我想一次性修改几个文件,前提是我能对它们都进行写入。我在想是否可以把多个打开文件的操作和 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
如果这样做不行,那这个问题的优雅解决方案应该是什么样的呢?
8 个回答
99
如果你需要一次打开很多文件,或者文件路径很长,把这些内容分成多行写会更方便。这个建议来自于Python风格指南,是@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())
134
只需要把 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
1456
从Python 2.7(或者3.1版本)开始,你可以这样写:
with open('a', 'w') as a, open('b', 'w') as b:
do_something()
(历史说明: 在早期的Python版本中,有时可以使用
contextlib.nested()
来嵌套上下文管理器。不过,这种方法在打开多个文件时效果并不好——具体细节可以查看链接的文档。)
如果你遇到一种比较少见的情况,需要同时打开多个文件,可以从Python 3.3开始使用contextlib.ExitStack
:
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# Do something with "files"
不过通常情况下,你可能更想要一个接一个地处理文件,而不是一次性打开所有文件,特别是当你要处理的文件数量不确定时:
for fname in filenames:
with open(fname) as f:
# Process f