Appearance
21|路径处理
文件操作离不开路径。手工拼接路径字符串容易出错——Windows 用反斜杠,Linux/macOS 用斜杠,路径末尾的斜杠处理不一致。Python 的 pathlib 模块用面向对象的方式处理路径,跨平台且不易出错。
一、Path 对象
python
from pathlib import Path
# 创建路径对象
p = Path("data", "users", "alice.txt")
# Windows: data\users\alice.txt
# Linux/macOS: data/users/alice.txtPath() 接收多个路径段,自动使用当前操作系统的路径分隔符。
二、路径拼接
用 / 运算符拼接路径:
python
base = Path("data")
file = base / "users" / "alice.txt"
# data/users/alice.txt/ 运算符可以接受字符串或另一个 Path:
python
base / "subdir" # Path("data/subdir")
base / Path("subdir") # Path("data/subdir")三、常用属性与方法
python
p = Path("/home/alice/docs/report.txt")
p.name # 'report.txt',文件名
p.stem # 'report',不带后缀的文件名
p.suffix # '.txt',后缀
p.suffixes # ['.txt'],多个后缀时返回列表
p.parent # Path('/home/alice/docs'),父目录
p.parents[0] # Path('/home/alice/docs')
p.parents[1] # Path('/home/alice')
p.parts # ('/', 'home', 'alice', 'docs', 'report.txt')
p.absolute() # 绝对路径四、文件判断
python
p = Path("data.txt")
p.exists() # 是否存在
p.is_file() # 是否是文件
p.is_dir() # 是否是目录
p.is_symlink() # 是否是符号链接五、读写文件
Path 对象自带读写方法,比 open() 更简洁:
python
p = Path("data.txt")
# 读文本
content = p.read_text(encoding="utf-8")
# 写文本
p.write_text("hello world", encoding="utf-8")
# 读二进制
bytes_data = p.read_bytes()
# 写二进制
p.write_bytes(bytes_data)write_text() 会覆盖原文件内容。需要追加时,仍然要用 open() 的 "a" 模式。
六、目录操作
python
d = Path("output", "reports")
# 创建目录
d.mkdir() # 父目录不存在时报错
d.mkdir(parents=True, exist_ok=True) # 父目录一起建,已存在不报错
# 创建文件
p = d / "report.txt"
p.touch() # 创建空文件,已存在不报错
# 删除
p.unlink() # 删除文件
p.unlink(missing_ok=True) # 文件不存在不报错
d.rmdir() # 删除空目录七、遍历目录
python
base = Path("data")
# 列出所有文件和目录
for item in base.iterdir():
print(item)
# 递归遍历所有文件
for item in base.rglob("*.txt"):
print(item) # 所有 .txt 文件
# 匹配模式
for item in base.glob("**/*.py"):
print(item) # 所有 .py 文件(包括子目录)iterdir() 只遍历直接子项。glob("*.txt") 匹配当前目录下的 .txt 文件。rglob("*.txt") 递归匹配所有子目录中的 .txt 文件。
八、获取当前路径
python
Path.cwd() # 当前工作目录
Path.home() # 用户主目录
__file__ # 当前模块文件的路径(字符串)
Path(__file__).resolve().parent # 当前模块所在目录的绝对路径Path.cwd() 返回程序启动时的工作目录,不是脚本文件所在的目录。需要脚本文件所在目录时,用 Path(__file__).resolve().parent。
九、与字符串互转
python
p = Path("data.txt")
str(p) # 'data.txt'
Path("data.txt") # 从字符串创建Path 对象在大多数接受路径字符串的地方都能直接使用(Python 3.6+)。需要传给只接受字符串的旧 API 时,用 str() 转换。
记忆锚点:pathlib.Path 用对象表示路径,跨平台;/ 拼接路径;read_text()/write_text() 一行读写;mkdir(parents=True, exist_ok=True) 安全创建目录;rglob() 递归匹配;Path.cwd() 是当前工作目录,Path(__file__).resolve().parent 是脚本所在目录。