回答

收藏

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

技术问答 技术问答 498 人阅读 | 0 人回复 | 2023-09-11

检查文件要写的目录是否存在。如果不存在,请使用 Python 创建目录最优雅的方法是什么?这是我试过的:
& T3 Q' [! C1 q' v7 V% f
    import osfile_path = "/my/directory/filename.txt"directory = os.path.dirname(file_path)try:    os.stat(directory)except:    os.mkdir(directory)f = file(filename)
    ; j) Q) Z4 P2 x+ a
不知何故,我错过了os.path.exists(感谢 kanja、Blair 和 Douglas)。这就是我现在所拥有的:
; n' o+ z, _3 T
    def ensure_dir(file_path):    directory = os.path.dirname(file_path)    if not os.path.exists(directory):        os.makedirs(directory)
    1 s7 k- p8 G5 E! A4 H
是否有标志open()自动发生?3 [# b7 R* O! L
                                                                ' _& y7 I9 o% H- M& n1 R+ B
    解决方案:                                                               
* q) H5 f$ w3 u, Y                                                                在 Python ≥ 3.5 上,使用pathlib.Path.mkdir:8 R6 T3 a* Y/ P8 y
    from pathlib import PathPath("/my/directory").mkdir(parents=True,exist_ok=True)3 H; Z( e: m- q+ T/ q
旧版 Python,我看到两个质量好的答案,每个都有一个小缺陷,所以我会给出我的看法:9 R% P5 X  A  W9 S; P
尝试os.path.exists,并os.makedirs考虑创作。
) W- _" k& h" K6 q
    import osif not os.path.exists(directory):    os.makedirs(directory)
    2 D! j6 b1 G. i; p  J
如评论等地方所述,有竞争条件 - 如果在os.path.exists和os.makedirs在调用之间创建目录,os.makedirs并显示失败OSError. 不幸的是,一揽子捕获OSError而且继续不是万无一失的,因为它会忽略其他因素导致的目录创建失败,如权限不足、磁盘满等。4 [3 b- P! p  C
捕获是一种选择OSError并检查嵌入的错误代码:
8 s% _2 s- N1 Y8 v( I
    import os,errnotry:    os.makedirs(directory)except OSError as e:    if e.errno != errno.EEXIST:        raise
    2 m3 Y  z  u+ A. x: X
或者,可能有第二个os.path.exists,但假设另一个人在第一次检查后创建了目录,然后在第二次检查前删除它——我们仍然可能被愚弄。
, o% W( E9 w1 j6 ^- F根据不同的应用程序,并发操作的风险可能大于或小于其他因素(如文件权限)。在选择实现之前,开发人员必须更多地了解正在开发的特定应用程序及其预期环境。
+ m' @4 v* @. [4 [2 J现代版Python 通过公开FileExistsError(在 3.3  中)…
2 w: k; l0 K  ?6 W: V3 ]& C/ }
    try:    os.makedirs("path/to/directory")except FileExistsError:    # directory already exists    pass5 ^8 k, |+ Z( O" C+ ]9 G  B
…并允许调用关键字参数os.makedirs``exist_ok(在 3.2  中)。
4 f% Y" i: `" c6 x7 T! c
    os.makedirs("path/to/directory",exist_ok=True)  # succeeds even if directory exists.+ o% V1 a5 {/ M
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则