目录:
pathlib 模块简介 Path类的基本使用 遍历目录 应用案例
pathlib 模块简介
在Python中,pathlib
模块是标准库的一部分,它在Python 3.4 版本中被引入。pathlib
模块提供了一组类来表示文件系统路径,这些类将文件路径作为对象来处理,使得文件路径的操作更加直观和方便,就像是在操作一个有各种功能的实体对象一样。
使用 pathlib
模块之前,我们需要先导入它。pathlib
模块中最常用的类是 Path
,它代表一个文件系统路径。
from pathlib import Path # 从pathlib模块导入Path类
Path类的基本使用
1、创建Path对象
我们可以使用不同的方式来创建 Path
对象。
表示当前目录:
from pathlib import Path
current_dir = Path('.') # 使用点号表示当前目录创建Path对象
print(f"当前目录对象: {current_dir}")
输出结果
当前目录对象:.
表示绝对路径:
from pathlib import Path
# 在Windows系统上,路径分隔符是反斜杠,但为了避免转义问题,我们使用原始字符串
# 例如 r'C:\Users\your_name'
# 在Linux或macOS上,路径分隔符是正斜杠,例如 '/home/user'
abs_path = Path(r'C:\Users\山海摸鱼人\Documents') # 表示绝对路径的Path对象
print(f"绝对路径对象: {abs_path}")
输出结果
绝对路径对象: C:\Users\山海摸鱼人\Documents
通过路径拼接创建:
from pathlib import Path
parent_dir = Path(r'C:\Users\山海摸鱼人')
sub_dir = 'Documents'
new_path = parent_dir / sub_dir # 使用斜杠运算符进行路径拼接
print(f"拼接后的路径对象: {new_path}")
输出结果
拼接后的路径对象: C:\Users\山海摸鱼人\Documents
2、获取路径的属性
Path
对象有很多有用的属性,可以帮助我们获取路径的各种信息。
获取绝对路径:
from pathlib import Path
rel_path = Path('test.txt')
abs_path = rel_path.absolute() # 获取绝对路径
print(f"相对路径 {rel_path} 的绝对路径是: {abs_path}")
输出结果
相对路径 test.txt 的绝对路径是: C:\Users\山海摸鱼人\test.txt
获取文件名:
from pathlib import Path
file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
file_name = file_path.name # 获取文件名
print(f"文件路径 {file_path} 的文件名是: {file_name}")
输出结果
文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的文件名是: test.txt
获取文件扩展名:
from pathlib import Path
file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
file_suffix = file_path.suffix # 获取文件扩展名
print(f"文件路径 {file_path} 的文件扩展名是: {file_suffix}")
输出结果
文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的文件扩展名是:.txt
获取父目录:
from pathlib import Path
file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
parent_dir = file_path.parent # 获取父目录
print(f"文件路径 {file_path} 的父目录是: {parent_dir}")
输出结果
文件路径 C:\Users\山海摸鱼人\Documents\test.txt 的父目录是: C:\Users\山海摸鱼人\Documents
3、路径操作方法
Path
对象还提供了很多方法来进行路径操作。
判断路径是否存在:
from pathlib import Path
dir_path = Path(r'C:\Users\山海摸鱼人\Documents')
if dir_path.exists():
print(f"路径 {dir_path} 存在")
else:
print(f"路径 {dir_path} 不存在")
输出结果(假设路径存在)
路径 C:\Users\山海摸鱼人\Documents 存在
判断是否为文件:
from pathlib import Path
file_path = Path(r'C:\Users\山海摸鱼人\Documents\test.txt')
if file_path.is_file():
print(f"路径 {file_path} 是一个文件")
else:
print(f"路径 {file_path} 不是一个文件")
输出结果(假设文件存在)
路径 C:\Users\山海摸鱼人\Documents\test.txt 是一个文件
判断是否为目录:
from pathlib import Path
dir_path = Path(r'C:\Users\山海摸鱼人\Documents')
if dir_path.is_dir():
print(f"路径 {dir_path} 是一个目录")
else:
print(f"路径 {dir_path} 不是一个目录")
输出结果(假设目录存在)
路径 C:\Users\山海摸鱼人\Documents 是一个目录
遍历目录
在实际应用中,我们经常需要遍历一个目录及其子目录,就像之前学过的 os.walk
函数那样。pathlib
模块也提供了方便的方法来实现这一功能。
1、遍历目录下的所有文件和子目录
from pathlib import Path
dir_path = Path('.')
for entry in dir_path.iterdir():
if entry.is_dir():
print(f"子目录: {entry}")
else:
print(f"文件: {entry}")
输出结果(假设当前目录有子目录 sub_dir 和文件 test.txt)
子目录:.\\sub_dir
文件:.\\test.txt
2、递归遍历目录
我们可以使用 rglob
方法来递归地遍历目录及其所有子目录,查找匹配特定模式的文件。
from pathlib import Path
# 查找当前目录及其子目录下所有的txt文件
for txt_file in Path('.').rglob('*.txt'):
print(f"找到的txt文件: {txt_file}")
输出结果(假设当前目录及其子目录有多个txt文件)
找到的txt文件:.\\test.txt
找到的txt文件:.\\sub_dir\\sub_test.txt
注意:pathlib
模块中 rglob
、glob
的区别:
glob
方法适合在当前目录级别查找文件和目录,如果你只关心当前目录下的文件,不涉及子目录,使用 glob
是一个不错的选择。
rglob
方法则更强大,当你需要递归地搜索目录树,查找文件和目录时,使用 rglob
会非常方便,它可以遍历当前目录及其所有子目录,查找匹配模式的文件和目录。
应用案例
1、文件备份
将一个目录及其所有子目录下的文件备份到另一个目录。
from pathlib import Path
import shutil
source_dir = Path('moyu')
target_dir = Path('backup')
# 如果目标目录不存在,创建它
if not target_dir.exists():
target_dir.mkdir()
# 遍历源目录及其子目录
for file in source_dir.rglob('*'):
if file.is_file():
relative_path = file.relative_to(source_dir)
target_path = target_dir / relative_path
target_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(file, target_path)
print("备份完成")
2、统计目录大小
通过 pathlib
模块来统计一个目录及其所有子目录下文件的总大小。
from pathlib import Path
dir_path = Path('./Pictures')
total_size = 0
for file in dir_path.rglob('*'):
if file.is_file():
total_size += file.stat().st_size
print(f"目录总大小: {total_size} 字节")
print(dir_path.absolute())
了解了如何创建 Path
对象,获取路径的属性,进行路径操作,以及遍历目录等。pathlib
模块为我们处理文件路径提供了一种更加优雅和面向对象的方式,相比传统的 os
模块中的路径操作函数,它能让代码更加易读和维护。