我需要写入文件(截断),它本身所在的路径可能不存在)。例如,我想写信给/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__()
之前创建目录,您可以在尝试打开文件之前创建目录。