pathlib.Path是 Python 3.4后内置的文件路径库,用面向对象 + 运算符的方式处理文件,代码更短、更易读。今天我们就来看看这个点。import osbase = os.path.dirname(os.path.abspath(__file__))config = os.path.join(base, "config", "settings.json")os.makedirs(os.path.dirname(config), exist_ok=True)
from pathlib import Pathbase = Path(__file__).parentconfig = base / "config" / "settings.json"config.parent.mkdir(parents=True, exist_ok=True)
可见pathlib可以直接用/ 拼接路径,像我们正常写地址一样,全部链式调用,不用去嵌套函数。from pathlib import Pathp = Path("/Users/yamil/projects/pipeline/tasks.json")print(p.name) # 文件名:tasks.jsonprint(p.stem) # 文件名无后缀:tasksprint(p.suffix) # 后缀:.jsonprint(p.parent) # 父目录:/Users/yamil/projects/pipelineprint(p.parts) # 路径分段元组print(p.is_absolute()) # 是否绝对路径print(p.exists()) # 是否存在
用Path来读取文件,不用open()函数,来读取一个文本text = Path("data.json").read_text(encoding="utf-8")
Path("data.json").write_text('{"key": "value"}', encoding="utf-8")
raw = Path("img.png").read_bytes()Path("out.png").write_bytes(b"binary data")
而传统使用os.path,我们则会需要使用open# 旧import ospath = os.path.join("data", "a.json")withopen(path) as f: text = f.read()# 新text = (Path("data") / "a.json").read_text()
# 创建单层目录Path("output").mkdir(exist_ok=True)# 创建多层嵌套目录(自动创建中间文件夹)Path("output/2026/05").mkdir(parents=True, exist_ok=True)
p = Path("file.txt")p.exists() # 存在(文件/目录都算)p.is_file() # 是文件p.is_dir() # 是目录p.is_symlink() # 是软链接
看起来非常简单,当然它在遍历目录和模糊匹配上也是非常容易:forfileinPath("covers").iterdir(): print(file.name)
pngs = [f for f inPath(".").iterdir() if f.suffix == ".png"]
# 当前目录所有 JSONjson_files = list(Path(".").glob("*.json"))# 递归所有子目录 Python 文件py_files = list(Path(".").rglob("*.py"))
感觉非常的简洁。接下来我们看个常用的定时任务、自动化搅拌等配置的写法:from pathlib import Path# 脚本所在目录HERE = Path(__file__).parentTASKS_FILE = HERE / "tasks.json"LOG_FILE = HERE / "logs" / "app.log"# 自动创建目录LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
import osHERE = os.path.dirname(os.path.abspath(__file__))LOG_FILE = os.path.join(HERE, "logs", "app.log")
对于重命名、移动、删除的使用我们来直接通过示例来了解p = Path("draft.md")# 重命名p.rename("final.md")# 移动p.rename(Path("archive") / p.name)# 删除文件p.unlink(missing_ok=True) # 不存在不报错# 删除空目录Path("temp").rmdir()# 删除目录+内容import shutilshutil.rmtree(Path("temp"))
看似确实非常好用,那么什么时候还要用os.path呢?import os# 展开环境变量os.path.expandvars("$HOME/.config")# 展开用户目录 ~os.path.expanduser("~/projects")# 取共同父路径os.path.commonpath(["/a/b/c", "/a/b/d"])
到此我们对Pathlib有了初步了解,如果你还在一直用os.path不妨尝试一下它。