文件系统与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() 등 여러 함수를 여러 번 호출해야 합니다.
  • 동시에 운영 체제 기능(환경 변수, 프로세스, 권한 등)도 제공합니다.

  • 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의 영역입니다.

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 提供低级接口,实际更常用的是 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가 담당합니다.


相关文章: