在 Python 的 pathlib 模块中,.mkdir() 是 Path 对象最常用的目录创建方法。它对应传统 os 模块中的 os.mkdir() 和 os.makedirs(),但提供更统一、更安全的接口。
常见用法
1、创建单层目录
from pathlib import Path
p = Path("./new_folder")
p.mkdir()
# 前提:"./" 父目录必须存在;若 "new_folder" 已存在,则抛出 FileExistsError
2、递归创建多层目录
p = Path("./data/2026/07/reports")
p.mkdir(parents=True)
# 自动创建 data、2026、07 三层父目录(若不存在)
# 若 reports 已存在,抛出 FileExistsError
3、安全创建
p = Path("./logs/today")
p.mkdir(parents=True, exist_ok=True)
# 父目录自动创建 + 目录已存在也不报错
4、设置特定权限(Unix/Linux 环境)
p = Path("./private_data")
p.mkdir(mode=0o750)
# 创建目录,权限设为 rwxr-x---(所有者读写执行,组员读执行,其他人无权限)
# 注意:最终权限 = mode & ~umask(系统屏蔽位)
注意事项
1、parents=False时
如果parents=False(默认值),而目标路径的父目录不存在,会直接抛出FileNotFoundError。
p = Path("./a/b/c")
p.mkdir() # 若 ./a 或 ./a/b 不存在 → FileNotFoundError: [Errno 2] No such file or directory
(绝大多数场景下,请直接使用parents=True)
2、exist_ok=False 与并发风险
默认情况下,如果目录已存在会报错。
if not p.exists():
p.mkdir() # 存在竞态条件(TOCTOU)
在多线程或多进程环境下,可能在exists()检查通过后,另一个进程恰好创建了该目录,导致mkdir()崩溃。
正确做法:直接使用exist_ok=True,因为操作系统会在内核层面原子地处理“检查并创建”,比手动判断安全得多。
p.mkdir(parents=True, exist_ok=True) # 无惧并发
3、权限 (mode) 的实际效果受umask影响
在 Linux/macOS 中,即使设置了 mode=0o777,实际创建出的目录权限通常是 775 或 755,因为系统 umask(默认 022)会屏蔽掉组用户和其他用户的写权限。
# 即使代码写 777,实际权限可能是 755(如果 umask=022)
p.mkdir(mode=0o777)
若想强制精确权限,需在创建前调用os.umask(0)临时修改,但一般不推荐(会全局影响)。
4、Windows 下的权限行为
在 Windows 系统上,mode 参数被忽略,目录权限由 Windows 的 ACL(访问控制列表)和安全策略决定,不遵循 Unix 的八进制权限模型。
5、对符号链接(软链接)的行为
如果p是一个指向目录的符号链接,且链接已存在:
当
exist_ok=True时,不报错(视为目标目录存在)。当
exist_ok=False时,抛出FileExistsError(即使它是个链接,也会拦截)。
6、与os.mkdir/os.makedirs的对应关系
总结:
新建目录,记住两个 True:绝大多数情况下,直接用 p.mkdir(parents=True, exist_ok=True),不必提前 if exists。
权限随系统:不要在 Windows 上依赖 mode;在 Linux 上若需要精确权限,优先用 os.chmod() 事后调整,而不是依赖 mode(因为 umask 干扰)。
不要用 exists() + mkdir() 组合,这是典型的竞态条件漏洞,直接用 exist_ok=True 替代。
路径是文件时请注意:mkdir() 只负责目录。若 p 已经是一个普通文件且 exist_ok=True,它仍会抛出 NotADirectoryError,因为无法用文件名创建同名目录。