自动创建带有文件输出的目录

假设我想创建一个文件:

filename = "/foo/bar/baz.txt"


with open(filename, "w") as f:
f.write("FOOBAR")

这将给出一个IOError,因为/foo/bar不存在。

自动生成这些目录的最python化的方法是什么?是否有必要对每一个(即/foo,然后/foo/bar)显式调用os.path.existsos.mkdir ?

429464 次浏览

在Python 3.2+中,使用OP请求的api,你可以优雅做以下事情:


import os


filename = "/foo/bar/baz.txt"
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
f.write("FOOBAR")



对于Pathlib模块(在Python 3.4中引入),有一种替代语法(感谢David258):

from pathlib import Path
output_file = Path("/foo/bar/baz.txt")
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text("FOOBAR")

在旧的python中,有一种不那么优雅的方式:

os.makedirs函数可以做到这一点。试试下面的方法:

import os
import errno


filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
try:
os.makedirs(os.path.dirname(filename))
except OSError as exc: # Guard against race condition
if exc.errno != errno.EEXIST:
raise


with open(filename, "w") as f:
f.write("FOOBAR")


添加try-except块的原因是为了处理在os.path.existsos.makedirs调用之间创建目录的情况,从而保护我们免受竞态条件的影响。