使用pathlib优化你的路径操作

news2024/9/21 1:27:06

目录

  • 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 os

directory = "/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 Path

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

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

2. 路径操作详解

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

2.1 路径对象创建

获取当前目录:

from pathlib import Path

current_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)
# 输出:data

print(csv_file)
# 输出:data/dataset.csv

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

2.2 路径属性检查

判断路径是否存在:

data_folder.exists()
# 返回 True 或 False

判断是否为目录或文件:

data_folder.is_dir()
# 返回 True 或 False

csv_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)
# 输出:sample

print(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 datetime

mod_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.coloradmin.cn/o/2150734.html

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

相关文章

做谷歌外链有什么基础的要求?

做谷歌外链建设时有几个基本的要求需要注意。首先,收录率很关键,只有被谷歌成功收录的外链才会对网站产生正面影响。如果一个外链没有被收录,那它基本上对提升排名没有任何帮助 外链的多样性也是至关重要的。获取来自不同网站和平台的链接能为…

双token无感刷新

文章目录 🟢双token无感刷新1、token过期续期的五种方案对比2、双token的基本概念3、双token无感刷新的原理4、双token无感刷新的实现方式5.前端实现 ✒️总结 🟢双token无感刷新 对于token无感刷新这个东西有复杂度的话,它主要在后端&#x…

网站建设的服务器该如何选择?

服务器的选择对于网站的稳定运行、性能表现以及成本控制至关重要。以下是一些关键的考虑因素,帮助你选择适合的服务器: 明确需求:你需要先明确网站的需求和目标。这包括确定服务器将用于托管什么样的应用(如Web前端、应用服务器、…

C/C++:优选算法(持续更新~~)

一、双指针 1.1移动零 链接:283. 移动零 - 力扣(LeetCode) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操…

【算法】BFS 系列之 多源 BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)01 矩阵 .1- 题目解析 .2- 代码编写 2)飞地的数量 .1- 题目解析 .2- 代码编写 3)地图中的最高点 .1- 题目解析 .2- 代码编写 4)地图分析 .1- 题…

103.运行tomcat的Tomcatstartup.bat时,终端打印的中文显示为乱码

目录 原因 解决方法 原因 当运行Tomcat的Tomcatstartup.bat时,如果终端中文显示为乱码,这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。 解决方法 针对这一问题,你可以尝试以下步骤来解决&#…

【Spring】IocDI详解(6)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 有什么不懂的都可以问我,看到消息会回复的,可能会不及时,请见谅!! 目录 本系列共…

深度图可视化显示(kitti)

文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据,有关kitti的深度图像内容我已有博…

扣子智能体实战:一键生成公众号图文,AI时代文盲也能写公众号,赚钱秘籍

文章目录 一,需求简述二,智能体制作1,智能体人设和技能2,流程开发2.1 设置开始节点2.2 增加一个生成标题的大模型节点2.3 增加一个代码节点 2.4 增加一个插件节点用以生成文章配图2.4 增加一个大模型节点-根据标题和思路生成文章大…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序(rank函数轻松搞定) 以上函数非常简单,记住两点: 1.rank排名同分作为同一名次,后面的名次需要占位,如,以上两个70分,同为第8名,那么第9名将被…

Shader 中的光源

1、Shader 开发中常用的光源属性 Unity当中一共支持四种光源类型: 平行光(Directional)点光源(Point)聚光灯(Spot)面光源(Area)— 面光源仅在烘焙时有用 不管光源类型到…

可视化工具箱-Visualization Toolkit(VTK)

一、Visualization Toolkit(VTK)简概 可视化工具箱(VTK),是一个用于3D计算机图形、图像处理和科学可视化的开源软件系统,其包含C类库和Tcl/Tk、Java与python的解释型接口层。VTK支持各种可视化算法&#xf…

软设9.20

1 已知一个文件中出现的各字符及其对应的频率如下表所示。若采用定长编码,则该文件中字符的码长应为()。若采用Hufman编码,则字符序列“face”的编码应为()。 1.() A.2 B.3 C.4 D.5 2.() A.110001001101…

小程序构建npm失败

小程序构建npm失败 项目工程结构说明解决方法引入依赖导致的其他问题 今天在初始化后的小程序中引入TDesign组件库,构建npm时报错。 项目工程结构说明 初始化后的项目中,包含miniprogram文件夹和一些项目配置文件,在project.config.json文件中…

VS运行程序时报错--无法定位程序输入点

发现问题: VS 在运行程序时,报错: 找到原因: 因为我在替换动态库的时候,只替换了lib库,没有替换运行目录下的dll库,运行时候的dll与程序中的lib库不对应。 替换库后就能解决这个问题。

秋意渐浓,温暖筹备——铁路职工御寒劳保鞋,寒冬无阻!

随着秋意渐浓,气温逐渐走低,冬日的寒风已在不远处蓄势待发。对于坚守在铁路一线的工友们来说,这不仅是季节的变换,更是工作装备升级换代的信号。意味着需要更加注重防寒保暖,以确保在寒冷的天气中能够安全、高效地工作…

前端大数据渲染:虚拟列表、触底加载与分堆渲染方案

前言 针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿 下面总结常见…

工程师 - PFM介绍

在电子电路设计中,PFM(Pulse Frequency Modulation,脉冲频率调制)是一种调制技术,其主要特点是在负载变化时调整脉冲的频率,而保持脉冲的宽度(时间长度)相对恒定。与PWM(…

lambda 自调用递归

从前序与中序遍历序列构造二叉树 官方解析实在是记不住&#xff0c;翻别人的题解发现了一个有意思的写法 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {auto dfs [](auto&& dfs, auto&&…

深度学习-图像处理篇1.1-1.2神经网络

1.1卷积神经网络基础 卷积层 对彩色RGB图像进行卷积 1.卷积核的通道数与输入特征层的通道数相同 2.卷积输出的特征矩阵通道数与卷积核个数相同 池化层 池化中一般池化核大小和步长大小一样 思考 加上偏移量bias该如何计算? 卷积计算时加上偏移量即可 加上激活函数该如何计…