以下是关于 Python pathlib
模块的详细指南,涵盖文件路径操作的核心功能及实际应用场景,帮助您替代传统的 os.path
方法:
一、pathlib
基础
1. 无需安装
pathlib
是 Python 3.4+ 的标准库,直接导入即可:
from pathlib import Path
2. 创建路径对象
# 当前工作目录
current_dir = Path.cwd()
# 相对路径
config_path = Path("config/data.yml")
# 绝对路径
abs_path = Path("/etc/nginx/nginx.conf")
3. 路径拼接
用 /
运算符代替字符串拼接:
base_dir = Path("my_project")
config_file = base_dir / "src" / "config.yaml" # 自动处理斜杠
二、常用操作示例
1. 检查路径属性
path = Path("data/sample.yml")
print(path.exists()) # 路径是否存在?
print(path.is_file()) # 是否是文件?
print(path.is_dir()) # 是否是目录?
print(path.suffix) # 文件后缀: .yml
print(path.stem) # 无后缀文件名: sample
print(path.parent) # 父目录: data
2. 读写文件
# 读取 YAML 文件(结合 PyYAML)
import yaml
data = yaml.safe_load(path.read_text(encoding="utf-8"))
# 写入文件
new_path = Path("output/data_processed.yml")
new_path.parent.mkdir(parents=True, exist_ok=True) # 自动创建目录
new_path.write_text(yaml.dump(data), encoding="utf-8")
3. 遍历目录
# 递归查找所有 YAML 文件
for yaml_file in Path("data").rglob("*.yaml"):
print(yaml_file)
4. 路径解析
path = Path("/var/log/app/error.log")
print(path.name) # 文件名: error.log
print(path.parent) # 父目录: /var/log/app
print(path.anchor) # 根目录: /
print(path.parts) # 路径分解: ('/', 'var', 'log', 'app', 'error.log')
三、进阶用法
1. 处理用户家目录
home = Path.home()
ssh_config = home / ".ssh/config"
2. 临时文件
with Path("temp_file.tmp").open("w") as f:
f.write("临时内容")
# 自动清理(Python 3.12+)
with Path("temp_file.tmp").delete_on_close() as f:
f.write_text("内容")
3. 通配符匹配(Glob)
# 匹配当前目录下所有 CSV 文件
for csv_file in Path().glob("*.csv"):
print(csv_file)
# 递归匹配子目录中的 Markdown 文件
for md_file in Path("docs").rglob("*.md"):
print(md_file)
4. 修改文件属性
path = Path("data.txt")
path.touch() # 创建空文件
path.chmod(0o644) # 修改权限
四、与 YAML 处理结合实战
场景:动态加载多环境配置
目录结构:
config/
├── dev/
│ └── settings.yaml
└── prod/
└── settings.yaml
from pathlib import Path
import yaml
def load_config(env: str) -> dict:
config_path = Path("config") / env / "settings.yaml"
if not config_path.exists():
raise FileNotFoundError(f"{config_path} 不存在")
return yaml.safe_load(config_path.read_text())
# 使用示例
dev_config = load_config("dev")
prod_config = load_config("prod")
五、常见问题解决
1. 路径不存在时报错
path = Path("non_existent.txt")
try:
data = path.read_text()
except FileNotFoundError:
print(f"{path} 未找到")
2. 跨平台路径兼容性
- 使用
/
运算符代替反斜杠 - 避免硬编码路径分隔符(
Path
自动处理 Windows/Unix 差异)
3. 路径转字符串
str_path = str(Path("data") / "config.yml") # 需要字符串的场景(如传给第三方库)
六、pathlib
vs os.path
对比
操作 | pathlib 写法 | os.path 写法 |
---|---|---|
拼接路径 | Path("a") / "b" | os.path.join("a", "b") |
获取父目录 | path.parent | os.path.dirname(path) |
检查文件是否存在 | path.exists() | os.path.exists(path) |
创建目录 | path.mkdir(parents=True) | os.makedirs(path, exist_ok=True) |
七、最佳实践
- 优先使用
Path
对象,减少字符串操作。 - 链式调用:
Path().parent.joinpath("new_dir").mkdir()
- 尽早处理异常:在操作前检查
exists()
或捕获FileNotFoundError
- 用
resolve()
获取绝对路径:Path("data.txt").resolve()
通过 pathlib
,您可以更安全、直观地操作文件路径,特别适合与 YAML/JSON 等配置文件处理结合使用。