Skip to content

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.txt

Path() 接收多个路径段,自动使用当前操作系统的路径分隔符。

二、路径拼接

/ 运算符拼接路径:

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 是脚本所在目录。