百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-27 01:02 9 浏览 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生成快捷方式需要管理员权限,所以在运行脚本时,记得一定要给权限。(以管理员的方式运行)

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码