Python创建目录及缺失的父目录的方法

Python创建目录及缺失的父目录的方法

技术背景

在Python编程中,经常会遇到需要创建目录以及其缺失的父目录的情况。例如,在进行文件存储时,需要确保存储路径的所有目录都存在。类似于Bash命令mkdir -p /path/to/nested/directory,Python也有多种方法来实现这一功能。

实现步骤

Python 3.5及以上版本

可以使用pathlib模块的Path.mkdir方法:

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

此方法递归创建目录,并且如果目录已存在不会抛出异常。parents=True表示如果父目录不存在则创建,exist_ok=True表示如果目录已存在则忽略。

Python 3.2 - 3.4版本

使用pathlib(需安装pathlib2

如果可以安装pathlib2,可以参照Python 3.5及以上版本的使用方法。

使用os模块
import os
os.makedirs(path, exist_ok=True)

os.makedirs递归创建目录,exist_ok=True时,如果目录已存在不会抛出异常。

Python 2.7及以上版本

使用pathlib(需安装pathlib2

同Python 3.5及以上版本的使用方法。

使用os模块
import os
try: 
    os.makedirs(path)
except OSError:
    if not os.path.isdir(path):
        raise

这种方法可以防止常见的竞态条件,并且能区分文件和目录。

替代方法(不推荐)

可以使用distutils.dir_util.mkpath,但此方法在Python 3.12中会被移除,且有严重限制,同一路径在一个Python进程中只能使用一次。

import distutils.dir_util
distutils.dir_util.mkpath(path)

核心代码

使用pathlib模块(Python 3.5+)

from pathlib import Path
path = Path('/my/directory/filename.txt')
path.parent.mkdir(parents=True, exist_ok=True) 

使用os模块(通用)

import os
import errno

try:
    os.makedirs(path)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

最佳实践

优先使用pathlib模块(Python 3.5+)

pathlib模块提供了面向对象的路径操作方式,代码更简洁易读。

from pathlib import Path
Path("/path/to/directory").mkdir(parents=True, exist_ok=True)

考虑竞态条件

在多进程或多线程环境中,需要考虑竞态条件。可以使用捕获OSError并检查错误码的方式来处理。

import os
import errno

try:
    os.makedirs(path)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

常见问题

竞态条件

在使用os.path.existsos.makedirs时,可能会存在竞态条件。例如,在检查目录不存在后,另一个进程可能会创建该目录,导致后续的os.makedirs失败。可以通过捕获OSError并检查错误码来解决。

目录已存在但为非目录对象

使用os.makedirs时,如果路径已存在但为文件而不是目录,会抛出异常。可以在捕获OSError后检查路径是否为目录来避免。

distutils.dir_util.mkpath的限制

该方法在一个Python进程中对同一路径只能使用一次,删除目录后再次使用不会重新创建。因此不建议使用该方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1010n111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值