问题

什么是最优雅的方法来检查一个文件将要写入的目录是否存在,如果没有,使用Python创建目录?这是我试过的:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)

不知何故,我错过了 os.path.exists (感谢kanja,Blair和道格拉斯).这就是我现在:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

有"开放"标志,这会自动发生吗?



解决方法

我看到两个有着良好品质的答案,每个都有一个小缺陷,所以我会给予我的承诺:

尝试 os.path.exists < / code> ,并考虑 os.makedirs < / code> 进行创建.

if not os.path.exists(directory):
    os.makedirs(directory)

如注释和其他部分所述,有一个竞争条件 - 如果目录是在 os.path.exists os.makedirs 调用之间创建的,代码> os.makedirs 将失败,并显示 OSError .不幸的是,覆盖捕获 OSError 和继续是不是万无一失,因为它会忽略由于其他因素,如权限不足,完整磁盘等创建目录的失败.

一个选项是捕获 OSError 并检查嵌入的错误代码,如果知道什么是什么(在我的操作系统上,13似乎表明权限被拒绝,并且17文件存在 - 尚不清楚这甚至是远程可移植的,但在是否有一个跨平台的方法从Python的OSError获取信息).或者,可以有第二个 os.path.exists ,但假设另一个在第一次检查后创建了目录,然后在第二个检查之前删除它 - 我们仍然可能被愚弄.

根据应用程序,并发操作的风险可能大于或小于其他因素(例如文件权限)带来的危险.在选择实现之前,开发人员必须更多地了解正在开发的特定应用程序及其预期的环境.




相关问题推荐