#在Python中检查目录是否存在,如果有必要就创建一个目录
##问题:
把文件写入某个目录之前,想要检查这个目录是否存在,实现这个目的的最优雅的方式是什么?如果这个目录不存在,用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.exists
和os.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
,但假设在初次检测后由另一个途经创建了目录,然后把目录移到二次检测之前,我们仍然有可能被愚弄。
根据应用程序的不同,并行操作的危险可能比其他因素所构成的危险更多或更少,例如文件权限。在选择实施前,开发人员必须对特定的应用程序和其预期的环境有更多的了解。