在打开文件进行写入之前递归创建目录



我需要写入文件(截断),它本身所在的路径可能不存在)。例如,我想写信给/tmp/a/b/c/config,但/tmp/a本身可能不存在。然后,显然,open('/tmp/a/b/c/config', 'w')不起作用,因为它不会创建必要的目录。但是,我可以使用以下代码:

import os
config_value = 'Foo=Bar'  # Temporary placeholder
config_dir = '/tmp/a/b/c'  # Temporary placeholder
config_file_path = os.path.join(config_dir, 'config')
if not os.path.exists(config_dir):
    os.makedirs(config_dir)
with open(config_file_path, 'w') as f:
    f.write(config_value)

有没有更 Python 的方法可以做到这一点?Python 2.x 和 Python 3.x 都很高兴知道(即使由于依赖性原因,我在代码中使用了 2.x)。

如果要在多个位置重复此模式,则可以创建自己的上下文管理器,以扩展open()并重载__enter__()

import os
class OpenCreateDirs(open):
    def __enter__(self, filename, *args, **kwargs):
        file_dir = os.path.dirname(filename)
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)
        super(OpenCreateDirs, self).__enter__(filename, *args, **kwargs)

然后你的代码变成:

import os
config_value = 'Foo=Bar'  # Temporary placeholder
config_file_path = os.path.join('/tmp/a/b/c', 'config')
with OpenCreateDirs(config_file_path, 'w') as f:
    f.write(config_value)

运行with open(...) as f:时要调用的第一个方法是 open.__enter__() 。因此,通过在调用 super(...).__enter__() 之前创建目录,您可以在尝试打开文件之前创建目录。

最新更新