如何在Python中使用"with open"打开多个文件?

950 投票
8 回答
496014 浏览
提问于 2025-04-16 09:31

我想一次性修改几个文件,前提是我能对它们都进行写入。我在想是否可以把多个打开文件的操作和 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

撰写回答