百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Pathlib库:Python面向对象的文件路径处理

off999 2024-10-26 12:08 23 浏览 0 评论

前言

Pathlib库提供了一个面向对象的API来解析,建立,测试和处理文件名和路径,而不是使用底层字符串操作。

其中Pathlib库有2个非常关键的类名:PurePosixPath,PureWindowsPath。它们可以在任意操作系统上实例化和使用,因为它们只处理文件名与目录名。

要实例化一个具体的类来处理真正的文件系统,需要使用Path得到一个PosixPath或WindowsPath,至于取哪个,取决于你是什么系统。

建立路径

下面,我们来通过Pathlib库建立路径。示例如下:

import pathlib

users = pathlib.PurePosixPath('/Users')
print(users)

users_liyuanjing = users / 'liyuanjinglyj'
print(users_liyuanjing)

users_yellow = users / pathlib.PurePosixPath('yellow')
print(users_yellow)

users_etc = users / '/ect/'
print(users_etc)

运行之后,效果如下:

如上面代码所示,我们通过PurePosixPath实例化一个新路径,新路径的对象表示的就是这个字符串的值。

而像之前使用os.path.join()组合路径,这里可以直接使用"/"符号进行拼接,即可以拼接字符串,也可以在拼接一个新路径的PurePosixPath对象。不过,有一点和os.path.join()一样,就是组合路径中,一旦后面也有“/”符号,那么就会舍弃前面的路径,比如最后的/etc路径。

joinPath()

既然提到了os.path.join()函数,我们就先来介绍一个Pathlib库中很像它的函数:joinPath()。它也是用于拼接路径的,具体示例如下:

import pathlib

users = pathlib.PurePosixPath()
paths = ['liyuanjinglyj', 'yellow']
result = users.joinpath(*paths)
print(result)

运行之后,效果如下:

路径格式化

既然是字符串路径,那么拼接的时候,肯定会有不规范的地方。所以,我们需要使用resolve()函数进行字符串路径规范化,示例如下:

import pathlib

users = pathlib.Path()
result = users / '..' / 'liyuanjing'
print(result.resolve())

users = pathlib.Path('/Users/local')
result = users / '..' / 'liyuanjing'
print(result.resolve())

运行之后,效果如下:

如上图所示,它会自动格式化路径,同时转化为绝对路径。

with_name()与with_suffix()

with_name():创建一个新路径,将一个路径中的文件名替换成为另一个不同的文件名。

with_suffix():创建一个新路径,将文件名的扩展名替换为一个不同的值。

示例如下:

import pathlib

one = pathlib.PurePosixPath('/base_demo/demo.py')
print(one)
two = one.with_name("yellow.py")
print(two)
three = two.with_suffix(".pyc")
print(three)

运行之后,效果如下:

如上图所示,with_name将文件名demo替换成了yellow。而with_suffix将文件名后缀py替换成了pyc。

解析路径

既然有组合路径,替换路径等。那么也会有解析路径,毕竟有时候我们只想要文件名,那么就必须分解路径。

分解路径会用到PurePosixPath成员变量parts,示例如下:

import pathlib

one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py')
print(one.parts)

运行之后,效果如下:

可以看到,这里将路径中的所有“/”分割的符号都分解了,最后一个肯定就是文件名或者文件(只有文件的话)。

既然这里,我们可以通过一层层的分解得到各个文件的名称,那么PurePosixPath类也肯定有层级给文件名分类,比如像获取某个文件的父目录,可以通过如下代码做到:

import pathlib

one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py')
print(one.parent)
print("----------")
for name in one.parents:
    print(name)

运行之后,效果如下:

通过parents,我们可以一级一级地返回其父亲目录,直到根目录为止。

这里,还有一些成员变量在实际的应用中会经常的用到,示例如下:

import pathlib

one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py')
print(one.name)
print(one.suffix)
print(one.stem)

运行之后,效果如下:

name:用于获取最后的文件名与后缀。

suffix:用于获取文件名的后缀

stem:用于获取文件名不要后缀

home()与cwd()

home():直接生成系统用户目录的路径

cwd():用于获取项目的绝对路径

示例如下:

import pathlib

one = pathlib.Path.home()
print(one)
two = pathlib.Path.cwd()
print(two)

运行之后,效果如下:

获取当前路径下的所有文件路径

在编写文件夹应用之时,我们每访问一个目录都会显示该目录下的所有文件与文件夹。而Pathlib库也能够做到这些,具体代码很简单,迭代iterdir()就行,示例如下:

import pathlib

one = pathlib.Path.cwd()
two = pathlib.Path('.')
for f1, f2 in zip(one.iterdir(), two.iterdir()):
    print('{} : {}'.format(f1, f2))

运行之后,效果如下:

设置条件获取文件(glob()与rglob())

在遍历获取文件时,我们可能并不需要获取所有文件,而只要获取某些特定后缀的文件。比如上面的目录中,我们只需要txt后缀的文本怎么办?

可以直接使用glob()进行过滤,示例如下:

import pathlib

one = pathlib.Path('.')
for f in one.glob('*.txt'):
    print(f)

运行之后,效果如下:

glob()与rglob()不同之处,在于rglob()是递归的,比如这层测试目录一直有一个.idea文件夹,使用glob()不会遍历到.idea文件夹里面的文件,而rglob()就会,而且只要继续有层级,会一直遍历符合条件的数据。

示例如下:

import pathlib

one = pathlib.Path('.')
for f in one.rglob('*'):
    print(f)

运行之后,效果如下:

读写文件

既然通过Pathlib库管理文件非常的方便,那么它能过读写文件,是不是就是一个完美的文件操作库呢?

其实,Pathlib库还真能直接对文件进行读写。下面,我们随机创建一个文件进行读写操作,示例如下:

import pathlib

f = pathlib.Path('text.txt')
f.write_bytes("My name is Li Yuanjing".encode('utf-8'))

with f.open('r',encoding='utf-8') as content:
    print(content.read())

print(f.read_text('utf-8'))

运行之后,效果如下:

这里,我们使用2种读取文件的方式,一种是通过with f.open()读取文件,一种是直接使用read_text()进行读取。唯一不同的是,如果要一行一行读取,可能前一种方式更合适。而写入文件直接使用write_bytes()函数就行,不过需要记得给写入内容指定编码。(当然直接写字符串可以用write_text()函数)

至于创建文件夹,直接使用f.mkdir()就行。

删除文件夹

在实际的文件操作中,我们还需要删除文件夹或者文件。而Pathlib库给我们提供了rmdir()函数进行空文件夹的删除,示例如下:

import pathlib

f = pathlib.Path('123')
f.rmdir()

如果文件夹不是空的,会直接报错,当然如果是空的就直接成功删除了。

如果是要删除文件,可以使用unlink()函数进行操作,示例如下:

import pathlib

f = pathlib.Path('a.txt')
f.unlink()

文件属性

在编写文件管理器应用时,我们往往还会获取文件的属性,比如创建时间,修改时间等等。Pathlib库可以很方便地获取这些数据的集合,示例如下:

import pathlib

f = pathlib.Path('英文文档.txt')
stat_info=f.stat()
print(stat_info)

运行之后,效果如下:

这里一共获取到文件的10个属性,具体含义如下表:

参数

含义

st_mode

inode 保护模式

st_ino

inode 节点号

st_dev

inode 驻留的设备

st_nlink

inode 的链接数

st_uid

所有者的用户ID

st_gid

所有者的组ID

st_size

普通文件以字节为单位的大小;包含等待某些特殊文件的数据

st_atime

上次访问的时间

st_mtime

最后一次修改的时间

st_ctime

创建时间

文件判断

os.path库有一大堆返回布尔类型的函数进行文件的判断,同样的Pathlib库也可以进行这些判断。博主这里列出了一张表格,判断文件的函数如下:

函数

意义

exists()

判断文件或文件夹是否存在

is_dir()

判断路径是否为文件夹

is_file()

判断路径是否为文件

is_symlink()

判断路径文件是否为快捷方式

is_socket()

是否是socket文件

is_fifo()

是否为管道

is_block_device()

是否是块设备

is_char_device()

是否是字符设备

is_absolute()

是否是绝对路径

创建快捷方式

在Windows系统中,我们经常使用的桌面图标就是应用程序的快捷方式,真正的exe运行程序其实在安装目录,而通过Pathlib库我们也可以直接创建文件的快捷打开方式。示例如下:

import pathlib

f = pathlib.Path('1234.txt')
f.symlink_to('英文文档.txt')

运行之后,你会发现打开1234.txt也就是打开了英文文档.txt,两者内容一样。效果如下:

需要注意的是,直接运行程序会报错,因为Windows生成快捷方式需要管理员权限,所以在运行脚本时,记得一定要给权限。(以管理员的方式运行)

相关推荐

Alist 玩家请进:一键部署全新分支 Openlist,看看香不香!

Openlist(其前身是鼎鼎大名的Alist)是一款功能强大的开源文件列表程序。它能像“万能钥匙”一样,解锁并聚合你散落在各处的云盘资源——无论是阿里云盘、百度网盘、GoogleDrive还是...

白嫖SSL证书还自动续签?这个开源工具让我告别手动部署

你还在手动部署SSL证书?你是不是也遇到过这些问题:每3个月续一次Let'sEncrypt证书,忘了就翻车;手动配置Nginx,重启服务,搞一次SSL得花一下午;付费证书太贵,...

Docker Compose:让多容器应用一键起飞

CDockerCompose:让多容器应用一键起飞"曾经我也是一个手动启动容器的少年,直到我的膝盖中了一箭。"——某位忘记--link参数的运维工程师引言:容器化的烦恼与...

申请免费的SSL证书,到期一键续签

大家好,我是小悟。最近帮朋友配置网站HTTPS时发现,还有人对宝塔面板的SSL证书功能还不太熟悉。其实宝塔早就内置了免费的Let'sEncrypt证书申请和一键续签功能,操作简单到连新手都能...

飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx

前面分享了两期TVGate:Q大的转发代理工具TVGate升级了,操作更便捷,增加了新的功能跨平台内网转发神器TVGate部署与使用初体验现在项目已经开源,并支持Docker部署,本文介绍如何通...

Docker Compose 编排实战:一键部署多容器应用!

当项目变得越来越复杂,一个服务已经无法满足需求时,你可能需要同时部署数据库、后端服务、前端网页、缓存组件……这时,如果还一个一个手动dockerrun,简直是灾难这就是DockerCompo...

深度测评:Vue、React 一键部署的神器 PinMe

不知道大家有没有这种崩溃瞬间:领导突然要看项目Demo,客户临时要体验新功能,自己写的小案例想发朋友圈;找运维?排期?还要走工单;自己买服务器?域名、SSL、Nginx、防火墙;本地起服务?断电、关...

超简单!一键启动多容器,解锁 Docker Compose 极速编排秘籍

想要用最简单的方式在本地复刻一套完整的微服务环境?只需一个docker-compose.yml文件,你就能一键拉起N个容器,自动组网、挂载存储、环境隔离,全程无痛!下面这份终极指南,教你如何用...

日志文件转运工具Filebeat笔记_日志转发工具

一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...

K8s 日志高效查看神器,提升运维效率10倍!

通常情况下,在部署了K8S服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的Filebeat+ElasticSearch+Kibana这一套组合...

如何给网站添加 https_如何给网站添加证书

一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...

10个Linux文件内容查看命令的实用示例

Linux文件内容查看命令30个实用示例详细介绍了10个Linux文件内容查看命令的30个实用示例,涵盖了从基本文本查看、分页浏览到二进制文件分析的各个方面。掌握这些命令帮助您:高效查看各种文本文件内...

第13章 工程化实践_第13章 工程化实践课

13.1ESLint+Prettier代码规范统一代码风格配置//.eslintrc.jsmodule.exports={root:true,env:{node...

龙建股份:工程项目中标_龙建股份有限公司招聘网

404NotFoundnginx/1.6.1【公告简述】2016年9月8日公告,公司于2016年9月6日收到苏丹共和国(简称“北苏丹”)喀土穆州基础设施与运输部公路、桥梁和排水公司出具的中标通知书...

福田汽车:获得政府补助_福田 补贴

404NotFoundnginx/1.6.1【公告简述】2016年9月1日公告,自2016年8月17日至今,公司共收到产业发展补助、支持资金等与收益相关的政府补助4笔,共计5429.08万元(不含...

取消回复欢迎 发表评论: