协慌网

登录 贡献 社区

如何在 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

如果不可能,那么解决该问题的优雅解决方案会是什么样?

答案

从 Python 2.7(或分别为 3.1)开始,您可以编写

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

在早期版本的 Python 中,有时可以使用contextlib.nested()嵌套上下文管理器。但是,这对于打开多个文件无法正常工作 - 有关详细信息,请参见链接的文档。


在极少数情况下,您想一次全部打开可变数量的文件,可以使用contextlib.ExitStack ,从 Python 3.3 版本开始:

with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
    # Do something with "files"

大多数情况下,您拥有一组可变的文件,但是您可能想要一个接一个地打开它们。

只需将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

对于一次打开多个文件或较长的文件路径,将内容分解成多行可能会很有用。 @Sven Marnach 在对另一个答案的评论中建议的《 Python 样式指南》中:

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())