【Python】Python 中 `pathlib.Path.mkdir` 方法的详解与实践

目录

  • 引言
  • 前置条件
  • 一、`Path.mkdir` 方法概述
  • 二、`Path.mkdir` 方法的参数详解
    • 2.1 `parents` 参数
    • 2.2 `exist_ok` 参数
  • 三、返回值与异常处理
    • 3.1 `FileExistsError`
    • 3.2 `FileNotFoundError`
    • 3.3 `PermissionError`
  • 四、常见使用场景与示例
    • 示例 1: 创建单一目录
    • 示例 2: 创建多级目录
    • 示例 3: 忽略已存在目录的错误
    • 示例 4: 同时使用 `parents` 和 `exist_ok`
  • 五、实践应用:创建多级目录
  • 六、`pathlib.Path.mkdir` 流程图
  • 七、总结与最佳实践
  • 总结
  • 参考资料

引言

在 Python 中,pathlib 模块是现代化的文件系统操作工具,提供了比传统的 os 模块更为简洁、直观的接口。pathlib.Path.mkdir 方法是其中用于创建目录的核心函数之一,它简化了目录创建过程,并通过灵活的参数控制,适应了各种使用场景。

本文将详细介绍 pathlib.Path.mkdir 方法的使用,包括常用参数、常见错误、实际应用示例以及一些实用技巧。无论是单层目录创建,还是递归创建多级目录,pathlib 都为你提供了便捷且高效的解决方案,帮助你在日常开发中更好地管理文件和目录。

前置条件

在使用 pathlib.Path.mkdir 方法之前,确保你已经安装并导入了 pathlib 模块。pathlib 模块自 Python 3.4 起便已成为标准库的一部分,因此你无需安装任何第三方库即可使用它。

导入 pathlib 模块

要使用 pathlib,你需要从标准库中导入 Path 类。你可以通过以下方式导入:

from pathlib import Path

Path 类不仅用于表示文件路径,还提供了多种方法来进行路径相关的操作,如创建、删除、重命名文件或目录等。在本文中,我们将专注于 Path.mkdir 方法,帮助你理解如何用它来创建目录。

环境要求

  • Python 版本要求pathlib 模块自 Python 3.4 版本开始包含在标准库中。因此,确保你的 Python 版本是 3.4 或更高。
  • 基本的文件操作知识:对于如何在 Python 中进行文件操作(如读取、写入文件等)有一定了解会帮助你更好地理解目录的管理操作。

一、Path.mkdir 方法概述

pathlib.Path.mkdir 方法是 Path 类的一个成员函数,主要用于在指定路径上创建目录。这个方法不仅支持创建单层目录,还可以递归创建多层目录,并且提供了灵活的参数来控制目录创建过程中的不同场景。在实际开发中,Path.mkdir 提供了比传统的 os.mkdir 方法更多的功能,特别是对于多层目录的管理和错误处理更加优雅。

方法签名

Path.mkdir(parents=False, exist_ok=False)

参数说明

  • parents (bool):

    • 默认值:False
    • 作用:如果为 True,则会递归创建缺失的父目录;如果为 False,则父目录必须已经存在,否则会抛出 FileNotFoundError 异常。
    • 适用场景:当我们希望确保多层目录都能被自动创建时,可以使用 parents=True,避免手动创建每一层父目录。
  • exist_ok (bool):

    • 默认值:False
    • 作用:如果为 True,当目标目录已经存在时,mkdir 方法不会抛出异常,而是直接跳过。如果为 False,当目标目录已存在时会抛出 FileExistsError 异常。
    • 适用场景:当你希望确保某个目录存在,且不关心是否已经存在时,使用 exist_ok=True 来避免异常。

返回值
Path.mkdir 方法返回 None,即没有返回值。目录创建是否成功会通过异常处理机制来反映。

二、Path.mkdir 方法的参数详解

Path.mkdir 方法接收两个关键参数:parentsexist_ok。理解这些参数的具体作用,可以帮助我们更灵活地创建目录。

参数类型默认值描述
parentsboolFalse如果为 True,则会创建缺失的父目录。如果为 False,则父目录必须已存在,否则抛出 FileNotFoundError
exist_okboolFalse如果为 True,则忽略目录已存在的情况,不会抛出异常。如果为 False,当目录已存在时抛出 FileExistsError

2.1 parents 参数

parents 参数决定了是否递归地创建所有父目录。当我们指定一个路径时,如果路径中某个父目录不存在,并且 parents=Truemkdir 会自动创建所有缺失的父目录。否则,如果 parents=False,而目标目录的父目录不存在,就会抛出 FileNotFoundError 异常。

示例:

from pathlib import Path

# 创建目录 'parent/child'
path = Path("parent/child")
path.mkdir(parents=True)  # 创建父目录 'parent',即使它不存在

如果 parents=False,且父目录不存在,会抛出 FileNotFoundError 异常:

from pathlib import Path

path = Path("parent/child")
try:
    path.mkdir(parents=False)  # 会抛出 FileNotFoundError,因为 'parent' 目录不存在
except FileNotFoundError:
    print("The parent directory does not exist.")

2.2 exist_ok 参数

exist_ok 参数决定了当目录已存在时是否抛出异常。如果设置为 True,即使目标目录已经存在,方法也不会抛出异常,直接跳过。如果设置为 False,如果目录已存在,方法会抛出 FileExistsError 异常。

示例:

from pathlib import Path

# 如果目录已存在,设置 exist_ok=True 不抛出异常
path = Path("example_dir")
path.mkdir(exist_ok=True)  # 目录已存在时,不会抛出错误

如果 exist_ok=False 且目录已存在,会抛出 FileExistsError

from pathlib import Path

path = Path("example_dir")
try:
    path.mkdir(exist_ok=False)  # 如果目录已存在,抛出 FileExistsError 异常
except FileExistsError:
    print("Directory already exists.")

三、返回值与异常处理

尽管 Path.mkdir 方法非常强大,但在实际使用中可能会遇到一些错误和异常。Path.mkdir 方法的返回值为 None,表示没有成功或失败的返回值。所有错误和异常都会通过抛出异常的形式进行处理。下面列出一些常见的异常类型以及如何处理它们。:

  • FileExistsError
    exist_ok=False 且目标目录已存在时,抛出此异常。

  • FileNotFoundError
    parents=False 且指定的父目录不存在时,抛出此异常。

  • PermissionError
    如果没有足够的权限在指定路径下创建目录,抛出此异常。

3.1 FileExistsError

如果 exist_ok=False 且目标目录已存在,mkdir 方法将抛出 FileExistsError 异常。

解决方法:

  • 你可以将 exist_ok 设置为 True,以避免目录已存在时抛出异常。
from pathlib import Path

path = Path("existing_dir")
try:
    path.mkdir(exist_ok=False)  # 目录已存在时抛出 FileExistsError
except FileExistsError:
    print("The directory already exists.")

3.2 FileNotFoundError

如果 parents=False 且指定的父目录不存在,mkdir 将抛出 FileNotFoundError 异常。

解决方法:

  • 使用 parents=True 来自动创建缺失的父目录。
from pathlib import Path

path = Path("parent/child")
try:
    path.mkdir(parents=False)  # 父目录 'parent' 不存在时抛出 FileNotFoundError
except FileNotFoundError:
    print("The parent directory does not exist.")

3.3 PermissionError

如果没有足够的权限在指定路径上创建目录,mkdir 方法将抛出 PermissionError 异常。

解决方法:

  • 确保在具有适当权限的路径下创建目录,或修改目录权限。
from pathlib import Path

path = Path("/restricted_directory")
try:
    path.mkdir()  # 没有权限时抛出 PermissionError
except PermissionError:
    print("Permission denied to create the directory.")

四、常见使用场景与示例

示例 1: 创建单一目录

from pathlib import Path

# 创建一个简单的目录
path = Path("example_dir")
path.mkdir()  # 如果目录已存在,抛出 FileExistsError 异常

示例 2: 创建多级目录

from pathlib import Path

# 创建多级目录 'parent/child'
path = Path("parent/child")
path.mkdir(parents=True)  # 自动创建父目录 'parent',如果它不存在

示例 3: 忽略已存在目录的错误

from pathlib import Path

# 如果目录已经存在,不抛出异常
path = Path("example_dir")
path.mkdir(exist_ok=True)  # 目录已存在时,不会抛出错误

示例 4: 同时使用 parentsexist_ok

from pathlib import Path

# 创建多级目录并忽略已存在目录的错误
path = Path("parent/child")
path.mkdir(parents=True, exist_ok=True)  # 即使目录已存在,也不会报错

五、实践应用:创建多级目录

在实际项目中,经常需要创建复杂的多级目录结构。pathlib.Path.mkdir(parents=True) 提供了一种简洁的方式来一次性创建多层目录。接下来,我们将创建一个包含多个子目录的目录结构。
假设我们需要创建如下目录结构:

project/
│
├── data/
│   ├── raw/
│   ├── processed/
│   └── reports/
└── logs/

我们可以通过以下代码一次性创建这些目录:

from pathlib import Path

# 创建项目根目录 'project'
base_path = Path("project")
base_path.mkdir(parents=True, exist_ok=True)

# 创建 'data' 子目录
data_path = base_path / "data"
data_path.mkdir(parents=True, exist_ok=True)

# 创建 'logs' 子目录
logs_path = base_path / "logs"
logs_path.mkdir(parents=True, exist_ok=True)

# 创建 'data/raw'、'data/processed'、'data/reports' 子目录
raw_path = data_path / "raw"
raw_path.mkdir(parents=True, exist_ok=True)

processed_path = data_path / "processed"
processed_path.mkdir(parents=True, exist_ok=True)

reports_path = data_path / "reports"
reports_path.mkdir(parents=True, exist_ok=True)

print("Project directory structure created successfully.")

运行以上代码后,目录结构将被创建如下:

project/
│
├── data/
│   ├── raw/
│   ├── processed/
│   └── reports/
└── logs/

通过设置 parents=True,我们确保了每个目录层级都会被自动创建,即使中间某些父目录不存在。exist_ok=True 则保证了如果目录已存在,不会抛出异常。

在这个例子中,我们先创建了根目录 project,然后递归创建 datalogs 目录。如果其中的任意目录已经存在,exist_ok=True 让代码不会抛出异常,避免干扰正常流程。

六、pathlib.Path.mkdir 流程图

为了更直观地理解 os.makedirs 的操作流程,以下是一个简洁的流程图,展示了如何使用 pathlib.Path.mkdir 方法创建多级目录结构。图中演示了如何通过设置 pathlib.Path.mkdir(parents=True) 来创建包含子目录的多层目录结构。parents=True 参数确保每个子目录会被自动创建,而 exist_ok=True 则保证即使目录已存在,也不会引发错误。这个流程图展示了目录创建的步骤和关键决策点,帮助我们更清晰地了解如何灵活管理目录结构。

CSDN @ 2136
开始
检查目录是否存在
目录是否存在?
exist_ok=True 吗?
如果是, 则忽略并退出
抛出 FileExistsError 错误
parents=True 吗?
创建缺失的父级目录
创建目标目录
设置权限
结束
CSDN @ 2136

这个流程图帮助我们理解 pathlib.Path.mkdir 方法的基本工作原理——它首先会检查目标目录是否已存在。如果目录已经存在,方法会根据 exist_ok 参数的设置来决定接下来的行为。如果 exist_ok=True,则不会抛出错误,而是简单地忽略已存在的目录;如果 exist_ok=False,则会引发一个 FileExistsError 错误,提示目录已经存在。若目标目录不存在,mkdir 方法会创建该目录,并可以根据 parents 参数的设置来决定是否一并创建缺失的父目录。通过合理地设置 exist_ok 和 parents 参数,用户可以灵活地控制目录创建的行为,包括是否自动创建多级父目录,或者在目录已存在时如何处理,从而提高文件管理操作的灵活性和安全性。

七、总结与最佳实践

  1. 递归创建目录
    使用 parents=True 可以确保目录的父目录自动创建,避免手动创建每一层目录。在处理需要创建多层目录结构的项目时,这个功能尤为重要。

  2. 避免不必要的异常
    使用 exist_ok=True 可以避免因目录已存在而导致的 FileExistsError 异常。如果你希望代码在目标目录已存在的情况下继续执行,而不是抛出异常,这个参数非常有用。

  3. 处理权限问题
    当在需要管理员权限或特殊权限的目录下创建目录时,要小心 PermissionError。在处理这种情况时,确保你有足够的权限,或者选择具有写入权限的目录。

  4. 提升代码可读性
    pathlib 提供了更加面向对象的方式来处理路径,相比于传统的 os 模块,代码更加简洁,容易理解,且能够避免路径字符串操作中的错误。例如,路径拼接不再依赖于手动加 /,而是通过 Path 对象进行简单的操作,减少了路径处理的复杂性。

  5. 跨平台兼容性
    pathlib 模块会自动处理操作系统的文件路径分隔符问题,因此在 Windows、Linux 或 macOS 系统中使用时,无需关心文件路径的格式问题。

总结

pathlib.Path.mkdir 方法是 Python 中进行文件系统操作的强大工具,能够简化目录创建的过程。通过灵活使用 parentsexist_ok 参数,我们可以精确控制目录创建的行为,无论是创建单层目录、递归创建多级目录,还是避免目录已存在时的错误。

  • parents=True 参数允许我们在目录路径中缺失的父目录自动创建,非常适合处理多级目录结构的情况。
  • exist_ok=True 参数确保在目标目录已经存在时不会抛出异常,简化了代码逻辑,避免了不必要的错误处理。

总的来说,pathlib.Path.mkdir 方法让文件系统操作更为简洁和直观,提高了代码的可读性与可维护性。通过灵活应用这些功能,开发者可以更高效地管理文件系统。若你尚未尝试过 pathlib,不妨将其应用到你的项目中,体验它带来的便利和提升。

参考资料

  • Python 官方文档 - pathlib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测,主要用于评估用户是否眨眼。 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...

开发环境:windows10 qt5.14, 编译器msvc2017x64,CMake3.30; 现象: CMakeList文件里,如有find_package(Qt5 COMPONENTS Widgets REQUIRED) target_link_libraries(dis_lib PRIVATE Qt5::Widgets) 用CMak…

基于SpringBoot+Vue的影院管理系统(含演示视频+运行截图+说明文档)

web启动链接地址: http://localhost:8082(管理端) http://localhost:8081(用户端) http://localhost:8082(员工端) 一、项目介绍 基于框架的系统,系统分为用户、员工和管理员三个…

SpringBoot3+Vue3开发图书馆管理系统

1 项目介绍 图书馆管理系统,管理图书、用户、借书、还书、实时监测归还是否逾期,逾期未归还会生成违规记录。违规状态不可借阅图书。需缴纳罚金,消除违规记录。可动态设置图书最多累计借阅数量上限和最长借阅天数上限,当用户满足…

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展,旗下人形机器人Figure 02在生产线上的性能得到了显著提升,机器人组成自主舰队,依托端到端技术,速度提高了400%,执行任务成功率提…

Oracle之Rman非归档模式下的完全恢复

引言 首先Oracle必须处在非归档模式下才能模拟各种情况,Oracle处在非归档模式,做数据库脱机备份,并且rman的参数使用快闪恢复区作为备份文件的存储目录,配置了控制文件的自动备份。 联机全备 示例1:控制文件、数据文件以及重做日志文件丢失的恢复 数据文件以及重做日志…

Android Google登录接入

官方文献: 1、前期准备: https://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cnhttps://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cn 2、具体开发: 新版 Googl…

Java 同步锁性能的最佳实践:从理论到实践的完整指南

目录 一、同步锁性能分析 (一)性能验证说明 1. 使用同步锁的代码示例 2. 不使用同步锁的代码示例 3. 结果与讨论 (二)案例初步优化分析说明 1. 使用AtomicInteger原子类尝试优化分析 2. 对AtomicInteger原子类进一步优化 …

Docker+Nginx | Docker(Nginx) + Docker(fastapi)反向代理

在DockerHub搜 nginx,第一个就是官方镜像库,这里使用1.27.2版本演示 1.下载镜像 docker pull nginx:1.27.2 2.测试运行 docker run --name nginx -p 9090:80 -d nginx:1.27.2 这里绑定了宿主机的9090端口,只要访问宿主机的9090端口&#…

C#编写的日志记录组件 - 开源研究系列文章

以前编写过一个日志记录组件的博文,这次发布一个修改过的完善版本。 1、 项目目录; 2、 源码介绍; 1) 实现; 2) 使用; 后面的参数为级别设置,只有大于这个级别的才进行日志记录,限制了日志记录的…

win10+vs2019+cmake+opencv4.10+opencv_contrib编译记录

win10vs2019cmakeopencv4.10opencv_contrib编译记录 第一章 环境配置 本机环境已经安装好vs2019和cmake。 第二章 下载opencv相关 1.Opencv4.10下载 下载链接:opencv 下载时选择"Sources" 2.opencv_contrib 下载链接:opencv_contrib 第三…

前端:HTML (学习笔记)【1】

一,网络编程的三大基石 1,URL (1)url —— 统一资源定位符: 网址——整个互联网中可以唯一且准确的确定一个资源的位置。 【项目外】 网址——https://www.baidu.com/ …

2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究

复杂场景下水下图像增强技术的研究 对于海洋勘探来说,清晰、高质量的水下图像是深海地形测量和海底资源调查的关键。然而,在复杂的水下环境中,由于光在水中传播过程中的吸收、散射等现象,导致图像质量下降,导致模糊、…

基于SpringBoot的“广场舞团系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“广场舞团系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 社团界面图 社团活…

视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调用无效问题

流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来,随着技术的不断进步和应用场景的不断拓展,流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时,流媒体播放器也会成为数字娱乐产业的重要组成部分,…

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN(LeNet-5网络) 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…

Live2D嵌入前端页面

废话不多说,直接看效果,给页面中嵌入的一个动态的二次元人物,美化页面,实际效果自行查看。 教程开始 一. 把项目拉取到本地 项目地址 自行下载到本地,下载方式自行选择。 二.把项目文件夹放到前端页面目录内 三.把下…

openlayer 将 GeoJSON 格式的 geometry 转换为 feature

openlayer 将 GeoJSON 格式的 geometry 转换为 feature geometry格式如图: 代码: /*** 将 GeoJSON 格式的 geometry 转换为 feature* param geometry* returns*/geoJsonToWkt(geometry) {const { coordinates, type } geometry;let olGeometry;swit…

web应用安全和信息泄露预防

文章目录 1:spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2:服务端口的合理使用3:弱口令(密码)管理4:服务端攻击4.1、短信业务,文件上传等资源型接口1、…

基于LSTM的新闻中文文本分类——基于textCNN与textRNN

构建词语字典 def build_vocab(file_path, tokenizer, max_size, min_freq):# 定义词汇表字典:使用 vocab_dic {} 初始化一个空字典,用于存储每个词及其出现频率vocab_dic {}with open(file_path, r, encodingUTF-8) as f:for line in tqdm(f):lin l…