Skip to content

Latest commit

 

History

History
40 lines (25 loc) · 2.38 KB

402.md

File metadata and controls

40 lines (25 loc) · 2.38 KB

#在Python中检查目录是否存在,如果有必要就创建一个目录

原问题地址:http://stackoverflow.com/questions/273192/in-python-check-if-a-directory-exists-and-create-it-if-necessary

##问题:

把文件写入某个目录之前,想要检查这个目录是否存在,实现这个目的的最优雅的方式是什么?如果这个目录不存在,用Python创建此目录的最优雅的方式是什么?这是我的尝试:

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

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

f = file(filename)

不知怎的,我漏掉了os.path.exists(感谢kanja, Blair, and Douglas)。这是我现在得出的代码:

def ensure_dir(f):
    d = os.path.dirname(f)
    if not os.path.exists(d):
        os.makedirs(d)

是否有一个“open”指令,使得这项功能自动执行?

##答案:

我看到了两个回答,它们各有可取之处,也各有一个小的缺陷,所以我给出我的回答: 尝试os.path.exists,并考虑把os.makedirs用于创建目录。

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

正如在注解和其他地方所指出的那样,这里有一个竞态条件:如果目录创建于调用os.path.existsos.makedirs之时,os.makedirs将以OSError的形式宣告失败。不幸的是,重写OSError和继续执行皆非万无一失。由于权限不足、磁盘已满等其他因素,os.makedirs将忽略某项失败而创建该目录。

有一种选择是阻止OSError并检查错误,如果你熟悉情况(在我的操作系统中,13似乎表明权限被拒绝,17表明文件存在。目前尚不清楚,这是否更适合远程便携式操作,但Is there a cross-platform way of getting information from Python’s OSError)对此进行了探究。或者,可能还有第二个os.path.exists,但假设在初次检测后由另一个途经创建了目录,然后把目录移到二次检测之前,我们仍然有可能被愚弄。

根据应用程序的不同,并行操作的危险可能比其他因素所构成的危险更多或更少,例如文件权限。在选择实施前,开发人员必须对特定的应用程序和其预期的环境有更多的了解。