Python创建目录及缺失的父目录的方法
Python创建目录及缺失的父目录的方法
技术背景
在Python编程中,经常会遇到需要创建目录以及其缺失的父目录的情况。例如,在进行文件存储时,需要确保存储路径的所有目录都存在。类似于Bash命令mkdir -p /path/to/nested/directory
,Python也有多种方法来实现这一功能。
实现步骤
Python 3.5及以上版本
可以使用pathlib
模块的Path.mkdir
方法:
1 |
|
此方法递归创建目录,并且如果目录已存在不会抛出异常。parents=True
表示如果父目录不存在则创建,exist_ok=True
表示如果目录已存在则忽略。
Python 3.2 - 3.4版本
使用pathlib
(需安装pathlib2
)
如果可以安装pathlib2
,可以参照Python 3.5及以上版本的使用方法。
使用os
模块
1 |
|
os.makedirs
递归创建目录,exist_ok=True
时,如果目录已存在不会抛出异常。
Python 2.7及以上版本
使用pathlib
(需安装pathlib2
)
同Python 3.5及以上版本的使用方法。
使用os
模块
1 |
|
这种方法可以防止常见的竞态条件,并且能区分文件和目录。
替代方法(不推荐)
可以使用distutils.dir_util.mkpath
,但此方法在Python 3.12中会被移除,且有严重限制,同一路径在一个Python进程中只能使用一次。
1 |
|
核心代码
使用pathlib
模块(Python 3.5+)
1 |
|
使用os
模块(通用)
1 |
|
最佳实践
优先使用pathlib
模块(Python 3.5+)
pathlib
模块提供了面向对象的路径操作方式,代码更简洁易读。
1 |
|
考虑竞态条件
在多进程或多线程环境中,需要考虑竞态条件。可以使用捕获OSError
并检查错误码的方式来处理。
1 |
|
常见问题
竞态条件
在使用os.path.exists
和os.makedirs
时,可能会存在竞态条件。例如,在检查目录不存在后,另一个进程可能会创建该目录,导致后续的os.makedirs
失败。可以通过捕获OSError
并检查错误码来解决。
目录已存在但为非目录对象
使用os.makedirs
时,如果路径已存在但为文件而不是目录,会抛出异常。可以在捕获OSError
后检查路径是否为目录来避免。
distutils.dir_util.mkpath
的限制
该方法在一个Python进程中对同一路径只能使用一次,删除目录后再次使用不会重新创建。因此不建议使用该方法。