文件系统与OS环境掌握:pathlib vs os

系列 02 – 用Python自由操控文件夹与文件

在编写程序时,创建文件、移动文件夹、检查路径等操作不可或缺。Python为此提供了两种“答案”。 一种是优雅处理路径的 pathlib,另一种是控制Python程序所运行的 操作系统(OS)环境os

机械与数字的相遇

如果把 pathlib 视为路径处理的明星,os 则更像后台的总监,负责灯光、音响、入口等一切。与其抛弃其中之一,不如根据角色合理搭配使用。


1. os 与 pathlib 有何区别?

Python 3.4 起引入 pathlib,路径处理方式大为改进。

  • os / os.path
  • 字符串 处理路径。
  • 函数式风格,组合链长时会出现 os.path.join()basename()splitext() 等多次调用。
  • 同时处理 OS功能(环境变量、进程、权限等)

  • pathlib

  • 对象(Path) 处理路径。
  • 通过 / 运算符组合、方法链调用,代码更短、更直观。
  • 在文件/目录遍历、扩展名处理等“路径工作”上更为便捷。

2. 必要操作代码对比

2.1 查看当前工作目录并创建文件夹

import os
from pathlib import Path

# os 方式
current_os = os.getcwd()
if not os.path.exists("test_os"):
    os.makedirs("test_os")

# pathlib 方式
current_pl = Path.cwd()
Path("test_pl").mkdir(exist_ok=True)

提示:若代码中路径频繁出现,pathlib 更利于维护。


2.2 组合路径(差异最明显的部分)

import os
from pathlib import Path

# os 方式
path_os = os.path.join("usr", "bin", "python")

# pathlib 方式(斜杠运算符)
path_pl = Path("usr") / "bin" / "python"

路径组合越多,pathlib 的可读性更高。


3. 推荐使用 pathlib 的原因:路径对象的力量

pathlib 的优势不仅限于“组合”。获取文件信息时差异更为明显。

功能 os.path 方式 pathlib 方式
文件名提取 os.path.basename(p) p.name
去除扩展名的文件名 os.path.splitext(os.path.basename(p))[0] p.stem
扩展名检查 os.path.splitext(p)[1] p.suffix
父目录 os.path.dirname(p) p.parent

这些细小的路径处理在项目中不断累积,统一使用 pathlib 能让团队代码更整洁。


4. 实战示例:查找特定扩展名的文件

在项目文件夹中查找所有 .txt 文件并列出。

from pathlib import Path

base_path = Path.cwd()
txt_files = list(base_path.rglob("*.txt"))  # 包含子文件夹的递归搜索

for file in txt_files:
    print(f"文件名: {file.name}, 绝对路径: {file.resolve()}")

只需一行 rglob(),递归搜索完成。pathlib 在“文件查找”方面表现卓越。


5. os 的强项:操作系统环境控制

从这里开始,平衡才是关键。 pathlib 是路径专家,但 OS 本身的操作 则是 os 的领域。

5.1 读取/写入环境变量(部署、安全、配置核心)

环境差异导致配置往往放在环境变量中。

import os

# 读取
db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db")

# 写入(仅对当前进程有效)
os.environ["APP_ENV"] = "production"

如 API 密钥、运行模式、日志级别、功能开关等,属于 os 的范畴。


5.2 进程/命令执行:让 OS 执行任务

外部命令或进程管理最终还是 OS 功能。 os 提供低级接口,实际更常用的是 subprocess,但两者都属于 OS 控制。

import os

# 简单执行(返回退出码)
exit_code = os.system("echo hello")
print(exit_code)

更细粒度的进程控制(启动/替换/分叉等)也在 os 里。


5.3 权限、用户、工作目录等“环境本身”

  • 权限更改(Unix 系统):os.chmod()
  • 更改工作目录:os.chdir()
  • 进程/用户信息:os.getpid()

这些功能 pathlib 无法替代,真正属于 os 的专属领域。


6. 结论:让 pathlib 与 os 分工合作

  • 路径操作 / 文件搜索 / 文件名处理pathlib 更易读、易维护。
  • 环境变量 / 进程 / 权限 / OS 功能os 专属。

最佳实践是:

  • “路径尽量用 Path 处理”
  • “需要与 OS 对话时使用 os

7. 小结

  • pathlib 大幅提升文件系统代码的可读性与可靠性。
  • os 超越路径,控制 Python 所在的操作系统环境。
  • 正确答案不是“选其一”,而是 pathlib + os 的组合

一句话总结:路径/文件工作用 pathlib,OS 环境控制用 os


相关文章: