440

可能重复:
python 中的 mkdir -p 功能

说我想制作一个文件:

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

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

这给出了IOError, 因为/foo/bar不存在。

自动生成这些目录的最 Pythonic 方式是什么?我是否有必要在每一个上显式调用os.path.existsand (即 /foo,然后 /foo/bar)?os.mkdir

4

1 回答 1

838

在 Python 3.2+ 中,您可以优雅地执行以下操作:


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")


在较旧的 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


于 2012-09-20T17:08:39.800 回答