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

我需要写一个文件(截断),它本身的路径可能不存在).例如,我想写入/ 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)

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

最佳答案
如果您在多个位置重复此模式,则可以创建自己的Context Manager,扩展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)

使用open(…)作为f:运行时要调用的第一个方法是打开.__输入__().因此,通过在调用super(…).__之前创建目录,输入__(),在尝试打开文件之前创建目录.

转载注明原文:python – 在打开文件进行写入之前递归创建目录 - 代码日志