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

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

技术背景

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

实现步骤

Python 3.5及以上版本

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

1
2
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模块

1
2
import os
os.makedirs(path, exist_ok=True)

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

Python 2.7及以上版本

使用pathlib(需安装pathlib2

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

使用os模块

1
2
3
4
5
6
import os
try:
os.makedirs(path)
except OSError:
if not os.path.isdir(path):
raise

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

替代方法(不推荐)

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

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

核心代码

使用pathlib模块(Python 3.5+)

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

使用os模块(通用)

1
2
3
4
5
6
7
8
import os
import errno

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

最佳实践

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

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

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

考虑竞态条件

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

1
2
3
4
5
6
7
8
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进程中对同一路径只能使用一次,删除目录后再次使用不会重新创建。因此不建议使用该方法。


Python创建目录及缺失的父目录的方法
https://119291.xyz/posts/2025-04-16.python-directory-creation-methods/
作者
ww
发布于
2025年4月16日
许可协议