使用pathlib优化你的路径操作

目录

  • 1. `pathlib` 是什么?
    • 1.1 `os` 的局限性
    • 1.2 `pathlib` 的优势
  • 2. 路径操作详解
    • 2.1 路径对象创建
    • 2.2 路径属性检查
  • 3. Path 对象的属性和方法
    • 3.1 获取路径的组成部分
    • 3.2 修改路径信息
  • 4. 文件操作
    • 4.1 文件的读写
    • 4.2 文件的重命名与删除
  • 5. 目录处理
    • 5.1 创建与移除目录
    • 5.2 遍历目录内容
  • 6. `Path` 类的核心功能概览
  • Ref

1. pathlib 是什么?

在日常的 Python 编程中,文件和目录的路径处理是一个常见且重要的任务。许多开发者习惯使用 os 模块来完成这些操作,例如获取文件列表、检查文件是否存在等。然而,直接将路径作为字符串进行处理可能会导致代码冗长、复杂,且容易出错。

自 Python 3.4 起,官方引入了 pathlib 模块,提供了一种更加优雅和高效的方式来处理文件系统路径。pathlib 通过将路径表示为对象,支持面向对象的路径操作,使代码更加简洁、可读。

本文将深入探讨 pathlib 模块的强大功能,通过实例对比展示其相对于 os 模块的优势,帮助你在文件和目录操作中事半功倍。

1.1 os 的局限性

假设我们需要获取某个目录下的所有 .txt 文件,使用 os 模块时,可能需要编写如下代码:

import osdirectory = "/Users/yourname/Documents"
txt_files = [os.path.join(directory, f)for f in os.listdir(directory)if os.path.isfile(os.path.join(directory, f)) and f.endswith(".txt")
]

这段代码中,我们需要多次调用 os.path 的方法来拼接路径和检查文件类型,代码显得繁琐且不直观。

1.2 pathlib 的优势

使用 pathlib,上述操作可以简化为:

from pathlib import Pathdirectory = Path("/Users/yourname/Documents")
txt_files = list(directory.glob("*.txt"))

pathlib 将文件系统路径视为对象,提供了丰富的方法来操作路径,使代码更加简洁清晰。许多大型开源项目都在使用 pathlib,足以证明其强大之处。

2. 路径操作详解

pathlib 模块的核心是 Path 类,它为文件和目录的操作提供了面向对象的接口。

2.1 路径对象创建

获取当前目录:

from pathlib import Pathcurrent_dir = Path.cwd()
print(current_dir)
# 输出示例:/Users/yourname/Projects

获取用户主目录:

home_dir = Path.home()
print(home_dir)
# 输出示例:/Users/yourname

通过字符串定义路径:

p = Path("my_folder")
print(p)
# 输出:my_folder

/ 运算符连接路径:

data_folder = Path(".") / "data"
csv_file = data_folder / "dataset.csv"print(data_folder)
# 输出:dataprint(csv_file)
# 输出:data/dataset.csv

使用 / 运算符可以直观地拼接路径,而不需要调用 os.path.join

2.2 路径属性检查

判断路径是否存在:

data_folder.exists()
# 返回 True 或 False

判断是否为目录或文件:

data_folder.is_dir()
# 返回 True 或 Falsecsv_file.is_file()
# 返回 True 或 False

获取绝对路径:

absolute_path = csv_file.resolve()
print(absolute_path)
# 输出示例:/Users/yourname/Projects/data/dataset.csv

转换路径为字符串:

path_str = str(Path.home())
print(path_str)
# 输出:/Users/yourname

值得注意的是,现代的许多库(如 pandasmatplotlibseaborn 等)都支持 Path 对象作为参数,进一步提升了 pathlib 的实用性。

3. Path 对象的属性和方法

Path 对象拥有许多有用的属性和方法,方便我们获取路径的各种信息。

3.1 获取路径的组成部分

访问父级目录:

image_file = Path("images/sample.png").resolve()
print(image_file.parent)
# 输出示例:/Users/yourname/Projects/images

获取文件名称:

print(image_file.name)
# 输出:sample.png

获取文件的前缀和后缀:

print(image_file.stem)
# 输出:sampleprint(image_file.suffix)
# 输出:.png

分解路径为各个部分:

print(image_file.parts)
# 输出:('/', 'Users', 'yourname', 'Projects', 'images', 'sample.png')

列出所有父级目录:

for parent in image_file.parents:print(parent)

输出:

/Users/yourname/Projects/images
/Users/yourname/Projects
/Users/yourname
/Users
/

3.2 修改路径信息

更改文件名或扩展名:

new_image_file = image_file.with_name("updated_sample.jpg")
print(new_image_file)
# 输出示例:/Users/yourname/Projects/images/updated_sample.jpg

修改文件后缀:

jpg_file = image_file.with_suffix(".jpg")
print(jpg_file)
# 输出示例:/Users/yourname/Projects/images/sample.jpg

4. 文件操作

pathlib 不仅可以处理路径,还提供了方便的方法来操作文件。

4.1 文件的读写

写入文本或二进制数据:

markdown_file = data_folder / "notes.md"# 写入文本内容(会覆盖原有内容)
markdown_file.write_text("# 这是一个示例 Markdown 文件")# 写入二进制内容
binary_file = data_folder / "data.bin"
binary_file.write_bytes(b'\x10\x20\x30\x40')

读取文本或二进制数据:

content = markdown_file.read_text()
print(content)
# 输出:# 这是一个示例 Markdown 文件binary_content = binary_file.read_bytes()
print(binary_content)
# 输出:b'\x10\x20\x30\x40'

向文件追加内容:

with markdown_file.open(mode="a") as file:file.write("\n## 追加的新章节")print(markdown_file.read_text())
# 输出:
# # 这是一个示例 Markdown 文件
# ## 追加的新章节

4.2 文件的重命名与删除

重命名文件:

renamed_file = markdown_file.with_stem("renamed_notes")
markdown_file.rename(renamed_file)
# 文件已重命名为 data/renamed_notes.md

获取文件大小:

file_size = renamed_file.stat().st_size
print(file_size)
# 输出文件大小(字节数)

获取文件的修改时间:

from datetime import datetimemod_time = datetime.fromtimestamp(renamed_file.stat().st_mtime)
print(mod_time)
# 输出示例:2023-08-15 14:20:30.123456

删除文件:

renamed_file.unlink(missing_ok=True)
# 文件已被删除

missing_ok=True 表示如果文件不存在,不会引发异常。

5. 目录处理

pathlib 同样提供了丰富的方法来创建、遍历和删除目录。

5.1 创建与移除目录

新建目录:

new_directory = Path("data/new_folder")
new_directory.mkdir(parents=True, exist_ok=True)
  • parents=True:如果父目录不存在,自动创建。
  • exist_ok=True:如果目录已存在,不会引发异常。

删除目录:

new_directory.rmdir()
# 注意:只能删除空目录

5.2 遍历目录内容

列举目录中的内容:

for item in Path.home().iterdir():print(item)

输出示例:

/Users/yourname/Documents
/Users/yourname/Downloads
/Users/yourname/Pictures
...

使用 glob 查找匹配模式的文件:

# 查找主目录下的所有 .txt 文件
home = Path.home()
text_files = list(home.glob("*.txt"))print(len(text_files))
# 输出:找到的 .txt 文件数量

使用 rglob 进行递归搜索:

# 递归查找所有子目录中的 .txt 文件
all_text_files = list(home.rglob("*.txt"))print(len(all_text_files))
# 输出:递归找到的 .txt 文件数量

6. Path 类的核心功能概览

本节对之前的内容进行了总结,方便大家速查。

实例化路径对象:

from pathlib import Path# 当前目录
current_path = Path()# 指定路径
specific_path = Path('/usr/local/bin')

路径操作方法:

  • 拼接路径path / 'subdir' / 'file.txt'
  • 获取绝对路径path.resolve()
  • 检查路径是否存在path.exists()
  • 判断是否为目录或文件path.is_dir()path.is_file()
  • 创建目录path.mkdir(parents=True, exist_ok=True)

访问路径信息:

  • 获取文件名path.name
  • 获取文件前缀path.stem
  • 获取文件后缀path.suffix
  • 获取父目录path.parent

文件读写操作:

  • 读取文本内容path.read_text()
  • 写入文本内容path.write_text("内容")
  • 读取二进制内容path.read_bytes()
  • 写入二进制内容path.write_bytes(b'数据')

遍历目录内容:

  • 遍历当前目录下的文件path.glob('*')
  • 递归遍历所有子目录path.rglob('*')

Ref

[1] https://www.bilibili.com/read/cv25592439/
[2] https://github.com/chris1610/pbpython/blob/master/extras/Pathlib-Cheatsheet.pdf
[3] https://docs.python.org/zh-cn/3/library/pathlib.html

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大厂程序员的健身之路

大厂程序员的健身之路 基本信息饮食正餐营养补剂 睡眠训练计划 基本信息 健身时间:2023.03 -> 2024.09体重变化:52kg -> 67kg 饮食 正餐 早餐:不吃午餐:两碗米饭 鱼/鸡肉 蔬菜 酸奶晚餐:两碗米饭 鱼/鸡肉…

简单题35-搜索插入位置(Java and Python)20240919

问题描述&#xff1a; Java&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int k 0;int i 0;while(i<nums.length){if(nums[i]target){return i;}if(nums[i]<target){k i1;}i;}return k;}}class Solution(object):def searchInsert(…

6.C_数据结构_查询_哈希表

概述 哈希表的查询是通过计算的方式获取数据的地址&#xff0c;而不是依次比较。在哈希表中&#xff0c;有一个键值key&#xff0c;通过一些函数转换为哈希表的索引值。 其中&#xff1a;这个函数被称为哈希函数、散列函数、杂凑函数&#xff0c;记为&#xff1a;H(key) 哈希…

NFT Insider #148:The Sandbox 推出 SHIBUYA Y3K 时尚系列,Azuki 进军动漫 NFT 领域

市场数据 加密艺术及收藏品新闻 Infinex 新推 NFT 系列首四日销售额破4000万美元 尽管顶级 NFT 系列表现不佳&#xff0c;Infinex 的最新 NFT 系列在首四日内销售额已超过 4000 万美元。Infinex 是一个非托管平台&#xff0c;提供轻松访问链上协议和 dApp。 Infinex Core 的…

189 轮转数组

解题思路&#xff1a; \qquad 首先要理解轮转的含义&#xff0c;轮转 将数组末尾元素移动至首位。轮转k不为负数&#xff0c;那如果k大于数组长度时会发生什么&#xff1f;定义n为数组长度&#xff0c;当k n时&#xff0c;数组元素的顺序又恢复成初始状态&#xff0c;下一次…

翻唱技巧:AU和Cubase翻唱录制对轨技巧

分享和记录一下个人翻唱的经验和技巧&#xff01;防止后续自己忘了&#xff01;同时如果有大佬看到&#xff0c;希望可以帮我指出其中的错误&#xff01;个人推荐用Cubase12录制翻唱&#xff0c;因为Cubase12可以做乐段的标记&#xff0c;翻唱时有助于学习一些歌曲的层次设计。…

opengl-redbook环境搭建(静态库)

所需库下载 gl3w(github地址)https://github.com/skaslev/gl3w 使用python3执行根目录下的gen脚本&#xff0c;会生成头文件include文件夹和src下gl3w.c文件。 glfw(github地址)https://github.com/glfw/glfw 本文项目结构 本文如红宝书一致&#xff0c;将glfw和gl3w引入…

【C高级】有关shell脚本的一些练习

目录 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 2、写一个脚本&#xff0c;包含以下内容&#xff1a; 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 1、在家目录下创建目录文件&#xff0c;dir 2、dir下创建dir1和dir2 …

【JAVA入门】Day48 - 线程池

【JAVA入门】Day48 - 线程池 文章目录 【JAVA入门】Day48 - 线程池一、线程池的主要核心原理二、自定义线程池三、线程池的大小 我们之前写的代码都是&#xff0c;用到线程的时候再创建&#xff0c;用完之后线程也就消失了&#xff0c;实际上这是不对的&#xff0c;它会浪费计算…

网络流之最大流(EK 模板)

EK的时间复杂度是O( )。 EK 算法 和 dinic 算法的区别是 &#xff1a;EK是通过 bfs 找到一条增广流&#xff0c;然后累加&#xff0c;循环此步骤直到 bfs 找不到增广流&#xff1b;而 dinic 算法 是通过 bfs 分层找到一条增广流&#xff0c;然后通过 dfs 跑完 当前分层图中所…

基于SpringBoot的中小医院管理系统

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

温故--javaproject

nginx反向代理和负载均衡 nginx 反向代理&#xff0c;就是将前端发送的动态请求由 nginx 转发到后端服务器 提高访问速度 因为nginx本身可以进行缓存&#xff0c;如果访问的同一接口&#xff0c;并且做了数据缓存&#xff0c;nginx就直接可把数据返回&#xff0c;不需要真正…

C++_21_模板

模板 简介&#xff1a; 一种用于实现通用编程的机制。 通过使用模板我们可以编写可复用的代码&#xff0c;可以适用于多种数据类型。 C模板的语法使用角括号 < > 来表示泛型类型&#xff0c;并使用关键字 template 来定义和声明模板 概念&#xff1a; c范式编程 特点&…

Telephony VOWIFI

1、VOWIFI框架 参考3GPP 23402文档, VOWIFI有如下相关架构设置。 1、S2a信任的WIFI热点 2、S2b非信任WIF热点 3、S2c直联核心WIF热点 目前使用比较多的为S2b非信任WIF热点。 2、EPDG建立过程 //Telephony Log IWLAN拨号 08-30 21:36:34.702857 1347 5131 D ConnectivityS…

基于YOLOv5的教室人数检测统计系统

基于YOLOv5的教室人数检测统计系统可以有效地用于监控教室内的学生数量&#xff0c;适用于多种应用场景&#xff0c;比如 自动考勤、安全监控或空间利用分析 以下是如何构建这样一个系统的概述&#xff0c;包括环境准备、数据集创建、模型训练以及如何处理不同类型的媒体输入…

排序----希尔排序

void ShellSort(int* a, int n) {int gap n;while (gap > 1){// 1保证最后一个gap一定是1// gap > 1时是预排序// gap 1时是插入排序gap gap / 3 1;for (size_t i 0; i < n - gap; i){int end i;int tmp a[end gap];while (end > 0){if (tmp < a[end]){…

Linux——K8s集群部署过程

&#xff11;、环境准备 &#xff08;1&#xff09;配置好网络ip和主机名 control: node1: node2: 配置ip 主机名的过程省略 配置一个简单的基于hosts文件的名称解析 [rootnode1 ~]# vim /etc/hosts // 文件中新增以下三行 192.168.110.10 control 192.168.110.11 node1 1…

【redis-01】redis基本数据类型和使用场景

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325 redis基本数据类型和使用场景 一&#xff0c;redis基本数据类型和使用场景1&#xff0c;String数据类型2&#xff0c;Hash数据类型3&#xff…

mat工具的几个实用地方

背景 使用mat的过程中&#xff0c;有几个值得关注的注意点&#xff0c;可以帮助我们尽快查找到问题的答案 mat实用的注意点 一.打开直方图后排序&#xff0c;直观查看内存占用大小,如下图所示 二.查看某个对象实例的具体值&#xff0c;点击对象&#xff0c;点击List Object…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …