文件操作是编程中常见的任务,但是传统的os模块提供的方法并不是很方便或直观。有没有一种更简单、更优雅的方式来处理文件路径和文件系统呢?答案是有的,那就是pathlib模块。
pathlib模块是Python 3.4引入的一个新的标准库,它提供了一种面向对象的方式来表示和操作文件路径。
在本文中,我们将介绍pathlib模块的基本概念,语法,以及一些实际的案例应用。
基本介绍
pathlib模块定义了两个主要的类:Path和PurePath。Path类是PurePath类的子类,它继承了PurePath类的所有属性和方法,并且增加了一些与文件系统交互的方法,比如创建、删除、重命名、读写文件等。PurePath类是一个抽象的类,它只表示文件路径的概念,而不依赖于具体的操作系统或文件系统。PurePath类有两个具体的子类:PurePosixPath和PureWindowsPath,分别对应于POSIX和Windows风格的文件路径。
语法简介
要使用pathlib模块,首先需要导入它:
from pathlib import Path
然后,可以用Path类来创建一个Path对象,表示一个文件或目录的路径。Path对象可以接受一个或多个字符串作为参数,它会自动根据操作系统的规则来拼接和规范化路径。例如:
p = Path('foo', 'bar', 'baz') # 创建一个相对路径
print(p) # 输出 foo/bar/baz
q = Path('/usr', 'bin') # 创建一个绝对路径
print(q) # 输出 /usr/bin
Path对象有许多属性和方法,可以方便地获取或修改路径的各个部分,比如父目录,文件名,扩展名,驱动器,根目录等。例如:
p = Path('foo/bar/baz.txt')
print(p.parent) # 输出 foo/bar
print(p.name) # 输出 baz.txt
print(p.stem) # 输出 baz
print(p.suffix) # 输出 .txt
print(p.drive) # 输出空字符串
print(p.root) # 输出空字符串
Path对象也可以进行运算,比如加法,表示路径的拼接,或者除法,表示路径的相对化。例如:
p = Path('foo')
q = Path('bar/baz')
r = p + q # 等价于 p.joinpath(q)
print(r) # 输出 foo/bar/baz
s = r / 'qux' # 等价于 r.joinpath('qux')
print(s) # 输出 foo/bar/baz/qux
t = s.relative_to(p) # 获取s相对于p的路径
print(t) # 输出 bar/baz/qux
Path对象还可以与字符串进行比较,判断路径是否相等,或者是否匹配某个模式。例如:
p = Path('foo/bar/baz.txt')
q = Path('foo/bar/baz.txt')
r = Path('foo/bar/qux.txt')
print(p == q) # 输出 True
print(p == r) # 输出 False
print(p.match('*.txt')) # 输出 True
print(p.match('foo/*.txt')) # 输出 False
案例应用
pathlib模块可以用于各种文件操作的场景,下面我们举几个例子来说明。
1)列出一个目录下的所有文件和子目录:
p = Path('.') # 当前目录
for x in p.iterdir(): # 遍历p下的所有内容
print(x) # 打印每一项的路径
2) 查找一个目录下的所有符合某个模式的文件:
p = Path('.') # 当前目录
for x in p.glob('*.py'): # 查找p下的所有以.py结尾的文件
print(x) # 打印每一个文件的路径
3)创建一个新的目录,如果已经存在则忽略:
p = Path('new_dir') # 新目录的路径
p.mkdir(exist_ok=True) # 创建新目录,如果已经存在则忽略
4)读取或写入一个文本文件的内容:
p = Path('test.txt') # 文本文件的路径
content = p.read_text() # 读取文件的内容
print(content) # 打印文件的内容
p.write_text('Hello, pathlib!') # 写入新的内容
pathlib模块是一个强大而灵活的模块,它可以让我们用一种更简单、更优雅的方式来处理文件路径和文件系统。