Python文件路径处理pathlib模块

一、 简介

pathlib是python3.4引入的标准库,提供了面向对象地、更直观的处理文件系统路径。推出pathlib的目的在于替代传统的os.path模块。

二、 Path Class

pathlib的一种有点就是提供面向对象的方式处理文件系统路径,于是Path类就很关键。

from pathlib import Path

p = Path('/home/user/documents/report.txt')

2.1、 路径拼接

pathlib可以使用/ 操作符来连接路径,如下:

from pathlib import Path
# 拼接路径
base_dir = Path('/home/user')
file_path = base_dir / 'documents' / 'report.txt'
print(file_path)  # 输出: /home/user/documents/report.txt

# 也可以从字符串开始
config_path = Path('config') / 'settings.json'
print(config_path)  # 输出: config/settings.json (Windows 上是 config\settings.json)

2.2、 获取路径的各个部分(属性)

p = Path('/home/user/docs/report.v2.py')

print(p.parent)     # /home/user/docs      → 父目录
print(p.name)       # report.v2.py         → 文件名(含扩展名)
print(p.stem)       # report.v2            → 文件名(不含扩展名)
print(p.suffix)     # .py                  → 最后一个扩展名
print(p.suffixes)   # ['.v2', '.py']       → 所有扩展名(列表)
print(p.anchor)     # /                    → 根目录(Windows 是 C:\)
print(p.drive)      # (Windows 有值)     → 驱动器盘符

常用属性名

属性名作用
parent父目录
name文件名(含扩展名)
stem文件名(不含扩展名)
suffix最后一个扩展名
parents一个父母录的数组

2.3、 解析路径

解析路径的作用主要是将相对路径转换成绝对路径,即处理路径中的.、..

# 获取绝对路径(并解析 .. 和 .)
p = Path('../file.txt')
absolute = p.resolve()
print(absolute)  # 输出完整的绝对路径

2.4、 检查路径状况

检查路径状态主要是判断这个路径是否存在、是文件还是目录,以便进行后续操作。

p = Path('../file.txt')
p.exists()       # 文件/目录是否存在
p.is_file()      # 是否是文件
p.is_dir()       # 是否是目录

2.5、 遍历当前目录

主要是Path类的三个方法:Path.iterdir()Path.glob(pattern)Path.rglob(pattern)
三个方法返回的内容都是Path对象迭代器

方法是否递归支持通配符用于什么
iterdir()遍历当前目录所有项
glob()当前目录下筛选匹配文件
rglob()所有子目录中递归筛选文件

Path.iterdir()

from pathlib import Path

p = Path('/some/path')
for item in p.iterdir():
    print(item)

输出内容:

/some/path/file1.txt
/some/path/file2.py
/some/path/folder

Path.glob(pattern)

from pathlib import Path

p = Path('/some/path')
for item in p.glob('*.txt'):
    print(item)

输出内容:

/some/path/file1.txt
/some/path/notes.txt

Path.rglob(pattern)

from pathlib import Path

p = Path('/some/path')
for item in p.rglob('*.py'):
    print(item)

输出内容:

/some/path/file1.py
/some/path/subdir/file2.py

2.6、 创建、删除目录和文件

创建目录

from pathlib import Path

# 创建单层目录
Path("my_folder").mkdir()

# 创建多层目录(如 parent/child),若父目录不存在时使用 parents=True
Path("parent/child").mkdir(parents=True, exist_ok=True)

parents=True: 自动创建所有上级目录。
exist_ok=True: 若目录已存在,不报错。
删除空目录:pathlib只能删除空目录,对于非空目录,库中没有直接的方法需要结合shutil

Path("my_folder").rmdir()

若目录不为空就会抛出异常

创建文件
touch() 方法会创建一个空文件,如果文件已经存在则不会改变已存在的文件中的内容。

Path("example.txt").touch()

2.7、 操作文件中的内容

pathlib中的方法可以操作文件中的内容进行读写,但是只适用于小文件,这里不做记录,对于文件操作还是使用with open等更高效的方法。

三、 _file_

python中的__file__是一个python的内置变量,他在模块中表示该模块源文件的路径,这个路径可能是相对路径也可能是绝对路径,可以和pathlib搭配使用,将相对路径解析。需要注意的是在交互式解释器中,这个内置变量是未定义的

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent
data_path = BASE_DIR / "data" / "file.json"

四、 pathlib和os的对比

特点os.pathpathlib
风格面向过程(函数式)面向对象(OOP)
引入版本Python 早期版本就有Python 3.4+(推荐用法)
代码风格基于字符串使用 Path 类(更语义化)
功能os.path 示例pathlib 示例
拼接路径os.path.join(a, b)Path(a) / b
获取绝对路径os.path.abspath("file.txt")Path("file.txt").resolve()
判断是否存在os.path.exists("a/b")Path("a/b").exists()
是否是文件os.path.isfile("a/b.txt")Path("a/b.txt").is_file()
是否是目录os.path.isdir("a")Path("a").is_dir()
获取文件名os.path.basename(path)Path(path).name
获取扩展名os.path.splitext(path)[1]Path(path).suffix
遍历目录os.listdir(path) + 拼接Path(path).iterdir()
递归搜索os.walk(path)Path(path).rglob("*.txt")
创建目录os.makedirs("new_dir", exist_ok=True)Path("new_dir").mkdir(parents=True, exist_ok=True)
删除文件os.remove("file.txt")Path("file.txt").unlink()
场景推荐模块原因
现代 Python 开发pathlib更简洁、可读性好、功能更强
与老代码兼容os.path某些项目可能还依赖它
处理路径的链式操作pathlibPath() 对象链式调用更自然
跨平台路径拼接(Windows/Linux)两者都行,但 pathlib 更方便

当然现在更推荐使用pathlib,更pythonic

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值