高效文件处理:Python pathlib实战指南
在使用Python
处理文件路径时,强烈建议使用pathlib
。
pathlib
以面向对象的方式处理文件路径,既避免了很多陷阱,也能使执行许多路径的相关操作变得更容易。
本篇总结了常用的使用pathlib
进行文件路径处理的方法。
1. 常用操作
首先介绍如何使用pathlib
来完成一些常规的文件路径相关操作。
1.1. 构造路径
构建路径对象,只需要将文件或文件夹路径的字符串传给Path
即可。
from pathlib import Path
fp = "D:\\temp\\pathlib"
path = Path(fp)
path
# path 对象
# WindowsPath('D:/temp/pathlib')
构造路径对象之后,Path
会自动判断出是windows
还是linux
下的路径。
1.2. 拼接和拆分路径
用字符串来拼接和拆分路径时,最麻烦的就是不同系统中路径分隔符(\ 和 /
)的处理。
使用Path
对象,能够避免此困扰。
new_path = path.joinpath("abc")
new_path
# WindowsPath('D:/temp/pathlib/abc')
new_path = Path(fp, "test.py")
new_path
# WindowsPath('D:/temp/pathlib/test.py')
使用joinpath
或者直接创建Path
对象时拼接路径,不需要指定路径分隔符。
使用Path
拆分路径也方便,它提供了多个属性来获取文件信息。
my_path = Path(fp, "program.py")
my_path
# WindowsPath('D:/temp/pathlib/program.py')
# 文件完整名
my_path.name
# 'program.py'
# 文件目录
my_path.parent
# WindowsPath('D:/temp/pathlib')
# 文件名(不带后缀)
my_path.stem
# 'program'
# 文件后缀名
my_path.suffix
# '.py'
# 修改文件后缀
my_path.with_suffix(".go")
# WindowsPath('D:/temp/pathlib/program.go')
1.3. 相对路径和绝对路径
相对路径转换为绝对路径,推荐使用Path
对象的resolve
方法。
path = Path("main.py")
path
# WindowsPath('main.py')
# 转换为绝对路径
path.resolve()
# WindowsPath('D:/projects/python/samples/main.py')
1.4. 遍历目录
遍历目录也是常用的文件路径操作。
fp = "D:\\temp\\pathlib\\a"
path = Path(fp)
for f in path.glob("*.txt"):
print(f)
# D:\temp\pathlib\a\1.txt
# D:\temp\pathlib\a\2.txt
# D:\temp\pathlib\a\3.txt
glob
函数是只遍历目录下的文件,如果要遍历子目录中的文件,使用rglob
函数。
for f in path.rglob("*.txt"):
print(f)
# D:\temp\pathlib\a\1.txt
# D:\temp\pathlib\a\2.txt
# D:\temp\pathlib\a\3.txt
# D:\temp\pathlib\a\sub_a\sub_1.txt
1.5. 读写文件
传统的读写文件方式,一般都是两个步骤:先通过open函数打开文件,再进行读或者写。
# 写入
with open("d:\\readme.txt", "w") as f:
f.write("abcdefg")
# 读取
with open("d:\\readme.txt", "r") as f:
content = f.read()
print(content)
# abcdefg
使用Path
对象,读写操作更加简单,代码也更清晰。
fp = "d:\\readme.txt"
path = Path(fp)
path.write_text("uvwxyz")
content = path.read_text()
print(content)
# uvwxyz
2. 更方便的操作
除了上面的常用操作,对于下面这些略微复杂文件路径的操作,
使用Path
也能更容易的完成。
2.1. 检查文件或目录是否存在
fp = "D:\\temp\\pathlib\\a"
path = Path(fp)
path.is_dir() # True
path.is_file() # False
path.exists() # True
2.2. 创建目录
创建目录使用Path
对象可以帮助我们自动处理异常情况。
path = Path("D:\\temp\\a\\b\\c\\d")
path.mkdir(exist_ok=True, parents=True)
exist_ok
和parents
参数为了创建文件夹时省了很多判断。
exist_ok=True
表示如果文件夹d存在就不创建,也不报错,反之会报错。
parents=True
表示文件夹d的上层的各级文件夹如果不存在就自动创建,反之如果文件夹d的上层有不存在的文件夹则报错。
2.3. 路径自动规范化
使用Path
来操作路径,不用过于关心不同操作系统的路径分割符问题。
在windows
系统中,也可以使用linux
的路径分割符,比如,下面两种方式都可以正常运行。
fp = "D:\\temp\\pathlib\\a"
path = Path(fp)
fp = "D:/temp/pathlib/a"
path = Path(fp)
3. 与os.path对比
pathlib
主要就是为了取代os.path
,它们之间的对比整理如下:
路径操作 | **pathlib ** | os.path |
---|---|---|
读取所有文件内容 | path.read_text() |
open(path).read() |
获取绝对文件路径 | path.resolve() |
os.path.abspath(path) |
获取文件名 | path.name |
os.path.basename(path) |
获取父目录 | path.parent |
os.path.dirname(path) |
获取文件扩展名 | path.suffix |
os.path.splitext(path)[1] |
文件名(不包含扩展名) | path.stem |
os.path.splitext(path)[0] |
相对路径 | path.relative_to(parent) |
os.path.relpath(path, parent) |
验证路径是否为文件 | path.is_file() |
os.path.isfile(path) |
验证路径是否为目录 | path.is_dir() |
os.path.isdir(path) |
创建目录 | path.mkdir(parents=True) |
os.makedirs(path) |
获取当前目录 | pathlib.Path.cwd() |
os.getcwd() |
获取主目录 | pathlib.Path.home() |
os.path.expanduser("~") |
按模式查找文件 | path.glob(pattern) |
glob.iglob(pattern) |
递归查找文件 | path.rglob(pattern) |
glob.iglob(pattern, recursive=True) |
规格化路径分隔符 | pathlib.Path(name) |
os.path.normpath(name) |
拼接路径 | Path(paraent, name) |
os.path.join(parent, name) |
获取文件大小 | path.stat().st_size |
os.path.getsize(path) |
遍历文件树 | path.walk() |
os.walk() |
将文件重定向到新路径 | path.rename(target) |
os.rename(path, target) |
删除文件 | path.unlink() |
os.remove(path) |
对比两种方式,就能体会pathlib的改进带来的好处。
高效文件处理:Python pathlib实战指南的更多相关文章
- 万字长文,Python数据分析实战,使用Pandas进行数据分析
文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
- 《Python开发实战》
<Python开发实战> 基本信息 作者: (日)BePROUD股份有限公司 译者: 盛荣 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115320896 上架时 ...
- Python 编码风格指南
原文:http://python.jobbole.com/84618/ 本文超出 PEP8 的范畴以涵盖我认为优秀的 Python 风格.本文虽然坚持己见,却不偏执.不仅仅涉及语法.模块布局等问题,同 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战5(上) - Git及Jenkins持续集成
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战4(上) - 接口测试框架实战
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战2 - 使用Python发送请求
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战1(下)- 接口测试工具的使用
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
随机推荐
- 十五,Spring Boot 整合连接数据库(详细配置)
十五,Spring Boot 整合连接数据库(详细配置) @ 目录 十五,Spring Boot 整合连接数据库(详细配置) 最后: JDBC + HikariDataSource(Spring Bo ...
- ScanFormer:逐层抵达目标,基于特征金字塔的指代表达理解框架 | CVPR'24
指代表达理解(REC)旨在在图像中定位由自由形式自然语言描述指定的目标对象.尽管最先进的方法取得了令人印象深刻的性能,但它们对图像进行了密集感知,包含与语言查询无关的多余视觉区域,导致额外的计算开销. ...
- 痞子衡嵌入式:为下一代AI边缘处理设备而生 - i.MXRT700
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT700. 四年前恩智浦官宣了面向下一代智能穿戴设备的 i.MXRT500 系列,这 ...
- 基于Keras-YOLO实现目标检测
Keras-YOLO 3项目使用Python语言实现了YOLO v3网络模型,并且可以导入Darknet网络预先训练好的权重文件信息直接使用网络进行目标识别. 1. 下载Keras-YOLO 3项目 ...
- ftrace options 中的irq-info
/sys/kernel/debug/tracing/options/irq_info 是 ftrace 中的一个选项,用于启用或禁用有关中断的详细信息的跟踪. options/irq_info 的具体 ...
- Java日期时间API系列23-----Jdk8中java.time包中的新的日期时间API类,获取准确开始时间00:00:00,获取准确结束时间23:59:59等
有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59.下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第 ...
- iOS 数据持久化方案-Realm的使用小结
一.Realm介绍 1.1.Realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android,核心数据引擎C++打造,并不是建立在SQLite之上的O ...
- threejs 父元素 相对位置 position 网格对象
设置position都是相对于父元素的位置设置的 // 导入 threejs import * as THREE from "three"; import { OrbitContr ...
- Vue3 和 Vue2 的区别 ?
1. Vue3 和 VUe2 性能提升 :使用 proxy 代替 defainProperty 实现响应式数据 :使用 ts 书写代码 : 新特性有:组合 api compositionApi :新 ...
- 云原生爱好者周刊:利用 DNS 计算圆周率
开源项目推荐 dns.toys dns.toys 是一个比较有创意的 DNS 服务器,它利用 DNS 协议提供了很多非常有趣的功能和服务.例如查询时间.天气.圆周率.单位换算等等. Submarine ...