假设我想创建一个文件:

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

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

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

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


在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中,有一种不那么优雅的方式:

操作系统。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.exists和os.path.exists之间创建目录时的情况。发出呼叫,以保护我们不受竞态条件的影响。