# 文件系统与OS环境掌握:pathlib vs os > **系列 02 – 用Python自由操控文件夹与文件** 在编写程序时,创建文件、移动文件夹、检查路径等操作不可或缺。Python为此提供了两种“答案”。 一种是优雅处理路径的 **`pathlib`**,另一种是控制Python程序所运行的 **操作系统(OS)环境** 的 **`os`**。 ![机械与数字的相遇](/media/editor_temp/6/dde8bc58-b467-4fe2-9370-24899d41a7bd.png) 如果把 `pathlib` 视为路径处理的明星,`os` 则更像后台的总监,负责灯光、音响、入口等一切。与其抛弃其中之一,不如根据角色合理搭配使用。 --- ## 1. os 与 pathlib 有何区别? Python 3.4 起引入 `pathlib`,路径处理方式大为改进。 * **`os` / `os.path`** * 以 **字符串** 处理路径。 * 函数式风格,组合链长时会出现 `os.path.join()`、`basename()`、`splitext()` 等多次调用。 * 同时处理 **OS功能(环境变量、进程、权限等)**。 * **`pathlib`** * 以 **对象(Path)** 处理路径。 * 通过 `/` 运算符组合、方法链调用,代码更短、更直观。 * 在文件/目录遍历、扩展名处理等“路径工作”上更为便捷。 --- ## 2. 必要操作代码对比 ### 2.1 查看当前工作目录并创建文件夹 ```python 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 组合路径(差异最明显的部分) ```python 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` 文件并列出。 ```python 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 读取/写入环境变量(部署、安全、配置核心) 环境差异导致配置往往放在环境变量中。 ```python 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 控制。 ```python 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`。 --- **相关文章:** - [[Python标准库 - 0] Python标准库是什么?面向初学者的指南](/ko/whitedec/2026/1/29/python-standard-library/) - [[Python标准库征服 3 - pathlib]](/ko/whitedec/2025/5/8/python-standard-library-pathlib/)