# 文件系统与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 有何区别? {#sec-364cc55e9b43} Python 3.4부터 `pathlib`가 도입되면서, 경로 처리 방식이 크게 개선되었습니다. * **`os` / `os.path`** * 以 **字符串** 处理路径。 * 함수형 스타일을 채택하여, 긴 경로 조합 체인을 처리할 때 `os.path.join()`、`basename()`、`splitext()` 등 여러 함수를 여러 번 호출해야 합니다. * 동시에 **운영 체제 기능(환경 변수, 프로세스, 권한 등)**도 제공합니다. * **`pathlib`** * 以 **对象(Path)** 处理路径。 * 通过 `/` 运算符组合、方法链调用,代码更短、更直观。 * 在文件/目录遍历、扩展名处理等“路径工作”上更为便捷。 --- ## 2. 必要操作代码对比 {#sec-5e9150e79d41} ### 2.1 查看当前工作目录并创建文件夹 {#sec-a76241f49a51} ```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 组合路径(差异最明显的部分) {#sec-218efe46442e} ```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 的原因:路径对象的力量 {#sec-729ef50152bc} `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. 实战示例:查找特定扩展名的文件 {#sec-fe3f388bc336} 在项目文件夹中查找所有 `.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 的强项:操作系统环境控制 {#sec-be977a2d760c} 从这里开始,平衡才是关键。 **`pathlib` 是路径专家**,但 **운영 체제 수준의 작업**은 `os`의 영역입니다. ### 5.1 读取/写入环境变量(部署、安全、配置核心) {#sec-6170eba35864} 환경 차이를 고려하여, 설정 정보는 주로 환경 변수에 저장됩니다. ```python import os # 读取 db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db") # 写入(仅对当前进程有效) os.environ["APP_ENV"] = "production" ``` 如 API 密钥、运行模式、日志级别、功能开关等,属于 `os` 的范畴。 --- ### 5.2 进程/命令执行:让 OS 执行任务 {#sec-7aaa50535332} 외부 명령이나 프로세스 관리는 결국 운영 체제 기능에 속합니다. `os` 提供低级接口,实际更常用的是 `subprocess`,但两者都属于 OS 控制。 ```python import os # 简单执行(返回退出码) exit_code = os.system("echo hello") print(exit_code) ``` 더 세밀한 프로세스 제어(예: 시작, 교체, 포크 등)도 `os` 모듈에서 제공합니다. --- ### 5.3 权限、用户、工作目录等“环境本身” {#sec-490171088e74} * 权限更改(Unix 系统):`os.chmod()` * 更改工作目录:`os.chdir()` * 进程/用户信息:`os.getpid()` 等 这些功能 `pathlib` 无法替代,真正属于 `os` 的专属领域。 --- ## 6. 结论:让 pathlib 与 os 分工合作 {#sec-5de19f31a1dc} * **路径操作 / 文件搜索 / 文件名处理** → `pathlib` 更易读、易维护。 * **环境变量 / 进程 / 权限 / OS 功能** → `os` 专属。 最佳实践是: * “路径尽量用 `Path` 处理” * “需要与 OS 对话时使用 `os`” --- ## 7. 小结 {#sec-d0a213b12cc0} * `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/)