文件路径模块pathlib
文件路径模块pathlib
文章目录
- 文件路径模块pathlib
- 1.概述
- 2.创建路径
- 2.1.创建非windos平台路径
- 2.2.动态拼接路径joinpath
- 2.3.替换文件名称 with_name
- 2.4.创建固定目录
- 2.5.创建文件夹和文件
- 1.创建多级目录mkdir
- 2.创建空文件
- 3.路径解析
- 3.1.根据路径分隔符解析路径parts
- 3.2.获取父级目录parent
- 3.3.获取路径最后一个部分name
- 4.目录内容
- 4.1.访问路径下所有文件iterdir
- 4.2.正则匹配文件glob
- 5.读写文件
- 6.文件类型
- 7.文件属性
- 7.1.stat获取文件属性
- 7.2.stat判断文件属性方法
- 8.权限
- 9.删除
- 9.1.删除空目录
- 9.2.删除目录文件
1.概述
前面介绍的os.path模块操作文件路径是基于字符串的底层操作,这篇文章介绍的pathlib模块也是处理文件路径,但是它比os.path模块操作更加方便。
pathlib模块提供了一个面向对象API接口来 解析、创建、测试和处理文件和路径。
2.创建路径
2.1.创建非windos平台路径
PurePath:代表并不访问实际文件系统的“纯路径”,只负责对路径字符串执行操作,不会在磁盘上创建路径及文件。PurePath有两个子类,即PurePosixPath和PathWindowsPath,分别代表UNIX风格的路径和Windows风格的路径。
Path:代表访问实际文件系统的“真正路径”。Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。有两个子类,即PosixPath和WindowsPath。
import pathlib# PurePosixPath非windows平台,创建一个路径对象
usr = pathlib.PurePosixPath('/usr')
print(usr)# 拼接路径
usr_local = usr / 'local'
print(usr_local)usr_share = usr / pathlib.PurePosixPath('share')
print(usr_share)root = usr / '..'
print(root)etc = root / '/etc/'
print(etc)
运行结果
/usr
/usr/local
/usr/share
/usr/..
/etc
2.2.动态拼接路径joinpath
如果创建的路径是未知的,可以将各个路径作为参数使用joinpath拼接。
import pathlibroot = pathlib.PurePosixPath('/')
subdirs = ['usr', 'local']
usr_local = root.joinpath(*subdirs)
print(usr_local)
运行结果
/usr/local
2.3.替换文件名称 with_name
当给定一个包含文件的路径时,我们想替换这个路径的文件名称,如果使用分隔符操作虽然可以获取到文件名称进行替换,但是操作有些复杂,这里提供了一个函数能够直接替换文件名称,他们都是返回新对象,原对象保持不变。
- with_name函数用来替换路径中文件名
- with_suffix函数修改文件后缀
import pathlibind = pathlib.PurePosixPath('source/pathlib/index.rst')
print(ind)
# 替换文件名称
py = ind.with_name('pathlib_from_existing.py')
print(py)# 替换文件后缀
pyc = py.with_suffix('.pyc')
print(pyc)
运行结果
source/pathlib/index.rst
source/pathlib/pathlib_from_existing.py
source/pathlib/pathlib_from_existing.pyc
2.4.创建固定目录
当我们创建目录时候可以指定一个固定目录,然后在目录后拼接路径。省去了每次都要写一个绝对路径,path类为我们提供了常用的方法,例如home方法获取当前系统的家目录,cwd方法获取当前工作目录。
import pathlibhome = pathlib.Path.home()
print('home: ', home)cwd = pathlib.Path.cwd()
print('cwd : ', cwd)
运行结果
home: /Users/edy
cwd : /Users/edy/my_pathlib
2.5.创建文件夹和文件
1.创建多级目录mkdir
mkdir方法可以用来创建多级目录
- parents = True: 创建中间级父目录
- exist_ok= True: 目标目录存在时不报错
import pathlibp = pathlib.PurePosixPath('dir/abd')
pathlib.Path(p).mkdir(parents=True, exist_ok=True)
print(p)
2.创建空文件
touch方法用来创建一个空文件,前提是文件创建的路径必须存在,路径不存在则会报错。
from pathlib import Pathmyfile = Path('dir/myfile.txt')
myfile.touch(exist_ok=True)
3.路径解析
3.1.根据路径分隔符解析路径parts
parts属性可以生成根据路径分隔符解析得到的一个路径段序列,返回是一个元组,反应了路径实例的不可变性。
import pathlibp = pathlib.PurePosixPath('/usr/local/lib')
print(p.parts)
运行结果
('/', 'usr', 'local', 'lib')
3.2.获取父级目录parent
获取父级目录有两个属性
parent属性获取一次path路径的父级路径
parents属性返回一个迭代器,他可以不断的获取上级目录,直到文件系统的根目录。
import pathlibp = pathlib.PurePosixPath('/usr/local/lib')
# 获取父级目录
print('parent: {}'.format(p.parent))print('\nhierarchy:')
# 迭代获取父级目录直到系统文件根路径
for up in p.parents:print(up)
运行结果
parent: /usr/localhierarchy:
/usr/local
/usr
/
3.3.获取路径最后一个部分name
name属性获取路径的最后一个部分与os.path.basename函数生成的值相同。
suffix属性获取文件扩展名
stem属性获取不含后缀的文件名
import pathlibp = pathlib.PurePosixPath('./source/pathlib/pathlib_name.py')
print('path : {}'.format(p))
# 获取文件名称
print('name : {}'.format(p.name))
# 获取文件后缀
print('suffix: {}'.format(p.suffix))
# 获取文件名称不包含后缀
print('stem : {}'.format(p.stem))
运行结果
path : source/pathlib/pathlib_name.py
name : pathlib_name.py
suffix: .py
stem : pathlib_name
4.目录内容
path类提供了一些方法用来访问目录列表和发现文件系统中的文件名。
4.1.访问路径下所有文件iterdir
iterdir方法是一个生成器,会返回指定目录中所有内容。如果path不指定一个目录,则iterdir() 抛出 NotADirectoryError
import pathlibp = pathlib.Path('.')# 返回指定路径下所有的文件
for f in p.iterdir():print(f)
4.2.正则匹配文件glob
glob方法根据正则表达式匹配符合条件的文件
import pathlibp = pathlib.Path('.')# 匹配当前路径下my开头,py后缀的文件
for f in p.glob('my_*.py'):print(f)
运行结果
my_parsing_path.py
my_dir_path.py
rglob方法可以递归遍历文件
import pathlibp = pathlib.Path('..')for f in p.rglob('pathlib_*.py'):print(f)
5.读写文件
Path实例包含一些方法读写文件内容,例如read_bytes() or read_text()读取文件内容, use write_bytes() or write_text()写入文件。可以使用open方法打开文件并保留句柄操作文件。
import pathlib# 当前路径下创建文件
f = pathlib.Path('example.txt')f.write_bytes('This is the content'.encode('utf-8'))with f.open('r', encoding='utf-8') as handle:print('read from open(): {!r}'.format(handle.read()))print('read_text(): {!r}'.format(f.read_text('utf-8')))
运行结果
read from open(): 'This is the content'
read_text(): 'This is the content'
6.文件类型
Path类包含了一些方法判断文件的类型。
- is_file()判断是不是文件类型
- is_dir()判断是不是目录类型
- is_symlink()判断是不是软链接类型
- is_fifo()判断是不是队列
- is_block_device()判断是不是块设备
- is_char_device()判断是不是字符设备
7.文件属性
7.1.stat获取文件属性
stat()方法和lstat()方法获取文件属性,lstat方法用来检查可能是软连接的目标状态。这两个方法返回的结果与os.stat和os.lstat方法相同。
import pathlib
import sys
import timeif len(sys.argv) == 1:filename = __file__
else:filename = sys.argv[1]p = pathlib.Path(filename)
stat_info = p.stat()# 文件的绝对路径
print('{}:'.format(filename))
# 文件大小
print(' Size:', stat_info.st_size)
# 文件权限
print(' Permissions:', oct(stat_info.st_mode))
# 文件所有者
print(' Owner:', stat_info.st_uid)
# 文件所在块设备
print(' Device:', stat_info.st_dev)
# 文件创建时间
print(' Created :', time.ctime(stat_info.st_ctime))
# 文件最后修改时间
print(' Last modified:', time.ctime(stat_info.st_mtime))
# 文件最后方法时间
print(' Last accessed:', time.ctime(stat_info.st_atime))
运行结果
/Users/edy/file_propert.py:Size: 632Permissions: 0o100644Owner: 501Device: 16777220Created : Mon Feb 13 17:26:24 2023Last modified: Mon Feb 13 17:26:24 2023Last accessed: Mon Feb 13 17:26:24 2023
owner()和group()单独获取文件所有者个分组信息
import pathlibp = pathlib.Path(__file__)print('{} is owned by {}/{}'.format(p, p.owner(), p.group()))
运行结果
/Users/edy/file_propert.py is owned by edy/staff
7.2.stat判断文件属性方法
import os
import pathlib
import statroot = pathlib.Path('test_files')
mode = os.stat(root).st_mode
# 判断文件是否存在.
if root.exists():for f in root.iterdir():f.unlink()
else:root.mkdir()if stat.S_ISREG(mode): # 判断是否一般文件print('Regular file.')
elif stat.S_ISLNK(mode): # 判断是否链接文件print('Shortcut.')
elif stat.S_ISSOCK(mode): # 判断是否套接字文件print('Socket.')
elif stat.S_ISFIFO(mode): # 判断是否命名管道print('Named pipe.')
elif stat.S_ISBLK(mode): # 判断是否块设备print('Block special device.')
elif stat.S_ISCHR(mode): # 判断是否字符设置print('Character special device.')elif stat.S_ISDIR(mode): # 判断是否目录print('directory.')##额外的两个函数
stat.S_IMODE(mode) # 返回文件权限的chmod格式
print('chmod format.')stat.S_IFMT(mode) # 返回文件的类型
print('type of fiel.')
8.权限
stat除了获取文件权限,还支持设置文件权限。 下面是设置文件权限的属性列表。
stat.S_ISUID: Set user ID on execution. 不常用
stat.S_ISGID: Set group ID on execution. 不常用
stat.S_ENFMT: Record locking enforced. 不常用
stat.S_ISVTX: Save text image after execution. 在执行之后保存文字和图片
stat.S_IREAD: Read by owner. 对于拥有者读的权限
stat.S_IWRITE: Write by owner. 对于拥有者写的权限
stat.S_IEXEC: Execute by owner. 对于拥有者执行的权限
stat.S_IRWXU: Read, write, and execute by owner. 对于拥有者读写执行的权限
stat.S_IRUSR: Read by owner. 对于拥有者读的权限
stat.S_IWUSR: Write by owner. 对于拥有者写的权限
stat.S_IXUSR: Execute by owner. 对于拥有者执行的权限
stat.S_IRWXG: Read, write, and execute by group. 对于同组的人读写执行的权限
stat.S_IRGRP: Read by group. 对于同组读的权限
stat.S_IWGRP: Write by group. 对于同组写的权限
stat.S_IXGRP: Execute by group. 对于同组执行的权限
stat.S_IRWXO: Read, write, and execute by others. 对于其他组读写执行的权限
stat.S_IROTH: Read by others. 对于其他组读的权限
stat.S_IWOTH: Write by others. 对于其他组写的权限
stat.S_IXOTH: Execute by others. 对于其他组执行的权限
下面通过一个例子演示为文件设置权限
import stat
import pathlib
f = pathlib.Path('pathlib_chmod_example.txt')
if f.exists():f.unlink()
f.write_text('contents')
# stat.S_IMODE转为chmod模式,参数是获取当前文件的权限
existing_permissions = stat.S_IMODE(f.stat().st_mode)
print('文件原始权限: {:o}'.format(existing_permissions))new_permissions = stat.S_IRUSR
# 设置文件新的权限
f.chmod(new_permissions)
# 转换成chmod模式输出
after_permissions = stat.S_IMODE(f.stat().st_mode)
print('After: {:o}'.format(after_permissions))
运行结果
文件原始权限: 644
修改后的权限: 400
9.删除
9.1.删除空目录
删除一个空目录可以使用rmdir,如果删除一个不为空的目录会报错。删除的目录不存在也会报错。
import pathlibp = pathlib.Path('example_dir')print('Removing {}'.format(p))
p.rmdir()
9.2.删除目录文件
对于文件、符号链接、路径,可以使用unlink()删除
import pathlibp = pathlib.Path('touched')p.touch()print('exists before removing:', p.exists())p.unlink()
运行结果
exists before removing: True
exists after removing: False
相关文章:
文件路径模块pathlib
文件路径模块pathlib 文章目录文件路径模块pathlib1.概述2.创建路径2.1.创建非windos平台路径2.2.动态拼接路径joinpath2.3.替换文件名称 with_name2.4.创建固定目录2.5.创建文件夹和文件1.创建多级目录mkdir2.创建空文件3.路径解析3.1.根据路径分隔符解析路径parts3.2.获取父级…...
spring cloud篇——什么是服务熔断?服务降级?服务限流?spring cloud有什么优势?
文章目录一、spring cloud 有什么优势二、服务熔断2.1、雪崩效应2.2、DubboHystrixCommand三、服务降级四、服务限流4.1、限流算法4.2、应用级限流4.3、池化技术4.4、分布式限流4.5、基于Redis 功能的实现限流4.6、基于令牌桶算法的实现4.6.1 、Java实现一、spring cloud 有什么…...
Tomcat构建
软件架构C/S:Client/Server.需要安装才能使用。B/S:Brower/Server。有浏览器就可以。资源分类动态资源:每个用户访问相同的资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,先转换为静态资源,再被浏览器解…...
入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)
入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现) 一、网络构建 1.1 问题导入 如图所示,数字五的图片作为输入,layer01层为输入层,layer02层为隐藏层,找出每列最大值对应索引为输…...
预算砍砍砍,IT运维如何降本增效
疫情短暂过去,一个乐观的共识正在蔓延:2023年的互联网,绝对不会比2022年更差。 “降本”是过去一年许多公司的核心策略,营销大幅缩水、亏损业务大量撤裁,以及层出不穷的裁员消息。而2023年在可预期的经济复苏下&#…...
10.Jenkins用tags的方式自动发布java应用
Jenkins用tags的方式自动发布java应用1.配置jenkins,告诉jenkins,jdk的安装目录,maven的安装目录2.构建一个maven项目指定构建参数,选择Git Paramete在源码管理中,填写我们git项目的地址,调用变量构建前执行…...
2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)
相同数字的积木游戏 1 题目 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字, 积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的 2 块积木块,计算他们的距离。 小薇请你帮忙替她…...
重构之改善既有代码的设计(一)
1.1 何为重构,为何重构 第一个定义是名词形式: 重构(名词):对软件内部结构的一种调整,目的是在不改变「软件可察行为」前提下,提高其可理解性,降低修改成本。 「重构」的另一个用…...
Kotlin data class 数据类用法
实验数据 {"code":1,"message":"成功","data":{"name":"周杰轮","gender":1} }kotlin数据类使用方便提供如下内部Api: equals()/hashCode()对 toString() componentN()按声明顺序与属性相…...
随笔-老子不想牺牲了
18年来到这个项目组,当时只有8个人,包括经常不在的架构师和经理。当时的工位在西区1栋A座,办公桌很宽敞。随着项目的发展,入职的人越来越多,项目的工位也是几经搬迁。基本上每次搬迁时,我的工位都是挑剩下的…...
三种查找Windows10环境变量的方法
文章目录一.在设置中查看二. 在我的电脑中查看三. 在资源管理器里查看一.在设置中查看 在系统中搜索设置 打开设置,在设置功能里,点击第一项 系统 在系统功能里,左侧菜单找到关于 在关于的相关设置里可以看到高级系统设置 点击高级系…...
STM32单片机DS18B20测温程序源代码
OLED液晶屏电路接口DS18B20电路接口STM32单片机DS18B20测温程序源代码#include "sys.h"#define LED_RED PBout(12)#define LED_GREEN PBout(13)#define LED_YELLOW PBout(14)#define LED_BLUE PBout(15)#define DS18B20_IO_IN() {GPIOA->CRL&0XFFFFFFF0;GPIOA…...
java日志查看工具finder介绍
目录 一、finder介绍 二、单节点部署 1、服务器需要安装Tomcat,以2.82.16.35为例 2、进入Tomcat下目录webapps下,创建FIND目录,进入FIDN目录 3、下载findweb插件,解压缩 4、登录页面,配置 5、添加日志路径 三、…...
手写现代前端框架diff算法-前端面试进阶
前言 在前端工程上,日益复杂的今天,性能优化已经成为必不可少的环境。前端需要从每一个细节的问题去优化。那么如何更优,当然与他的如何怎么实现的有关。比如key为什么不能使用index呢?为什么不使用随机数呢?答案当然…...
【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译
文章目录【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译摘要1. 简介2. 方法2.1 半监督框架概述2.2 监督局部对比学习2.3 下采样和块划分3. 实验4. 结论【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译 论文题目:Semi-supervised Contrastive Learning for Labe…...
vivo官网App模块化开发方案-ModularDevTool
作者:vivo 互联网客户端团队- Wang Zhenyu 本文主要讲述了Android客户端模块化开发的痛点及解决方案,详细讲解了方案的实现思路和具体实现方法。 说明:本工具基于vivo互联网客户端团队内部开源的编译管理工具开发。 一、背景 现在客户端的业…...
Python基础-数据类型之数字类型
变量中的变量值是用来存储事物状态的,事物的状态分成不同的种类(例如:人的姓名、年龄,身高、职位、工资等),因此变量值有多种不同的数据类型。 age 18 # 用整型记录年龄 salary 3.1 # 用浮点型记录…...
基于Web的6个完美3D图形WebGL库
现代前端、游戏和Web开发正是WebGL可以转化为数字杰作的东西。使用GPU绘制在浏览器屏幕上生成的矢量元素,WebGL创建交互式Web图形,从而获得用户体验。视觉元素的质量和复杂性使该工具在HTML或CSS等其他方法中脱颖而出。WebGL基础WebGL不是一个图形套件。…...
界面组件DevExpress Reporting v22.2 - 增强的Web报表组件UI
DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。DevExpress Reporting v22.2版本已正式发布&…...
初学vector
目录 string的收尾 拷贝构造的现代写法: 浅拷贝: 拷贝构造的现代写法: swap函数: 内置类型有拷贝构造和赋值重载吗? 完善拷贝构造的现代写法: 赋值重载的现代写法: 更精简的现代写法&…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
