Pyrhon-如何安全地创建嵌套目录?

检查文件目录是否存在的最优雅方法是什么(如果不存在),使用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(感谢魔芋,布莱尔和道格拉斯)。这就是我现在所拥有的:

def ensure_dir(file_path):

directory = os.path.dirname(file_path)

if not os.path.exists(directory):

os.makedirs(directory)

是否有“打开”标志,使它自动发生?

回答:

在Python≥3.5上,使用pathlib.Path.mkdir

from pathlib import Path

Path("/my/directory").mkdir(parents=True, exist_ok=True)

对于较旧的Python版本,我看到两个质量不错的答案,每个答案都有一个小缺陷,因此我将对此进行说明:

试试看os.path.exists,然后考虑os.makedirs创建。

import os

if not os.path.exists(directory):

os.makedirs(directory)

如注释和其他地方所述,这是一个竞争条件–如果在os.path.existsos.makedirs调用之间创建目录,os.makedirs则将失败并显示OSError。不幸的是,毯式捕获OSError和继续操作并非万无一失,因为它会忽略由于其他因素(例如权限不足,磁盘已满等)而导致的目录创建失败。

一种选择是捕获OSError并检查嵌入式错误代码(请参阅是否存在从Python的OSError获取信息的跨平台方法):

import os, errno

try:

os.makedirs(directory)

except OSError as e:

if e.errno != errno.EEXIST:

raise

另外,可能还有第二个os.path.exists,但是假设另一个在第一次检查后创建了目录,然后在第二次检查之前将其删除了–我们仍然可能会被愚弄。

取决于应用程序,并发操作的危险可能比其他因素(例如文件许可权)造成的危险更大或更小。在选择实现之前,开发人员将必须了解有关正在开发的特定应用程序及其预期环境的更多信息。

现代版本的Python通过暴露FileExistsError(在3.3+ 版本中)都极大地改善了此代码。

try:

os.makedirs("path/to/directory")

except FileExistsError:

# directory already exists

pass

…并通过允许关键字参数os.makedirs调用exist_ok(在3.2+版本中)。

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

以上是 Pyrhon-如何安全地创建嵌套目录? 的全部内容, 来源链接: utcz.com/qa/411852.html

回到顶部