当前位置:首页>python>用Python pathlib 来替换os.path

用Python pathlib 来替换os.path

  • 2026-10-11 07:32:59
用Python pathlib 来替换os.path
pathlib.Path是 Python 3.4后内置的文件路径库,用面向对象 + 运算符的方式处理文件,代码更短、更易读。今天我们就来看看这个点。
通常我们会用os.path来获取路径,例如:
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)
而用pathlib
from pathlib import Pathbase = Path(__file__).parentconfig = base / "config" / "settings.json"config.parent.mkdir(parents=True, exist_ok=True)
可见pathlib可以直接用/ 拼接路径,像我们正常写地址一样,全部链式调用,不用去嵌套函数。
接下来我们看看Path对象的常用属性:
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()   # 是软链接
看起来非常简单,当然它在遍历目录和模糊匹配上也是非常容易:
1.列出目录内容
forfileinPath("covers").iterdir():    print(file.name)
2.过滤后缀文件
pngs = [f for f inPath(".").iterdir() if f.suffix == ".png"]
3.通配符进行匹配
# 当前目录所有 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不妨尝试一下它。

最新文章

随机文章