R / Richie全部文章 ↑

Python · 4 分钟阅读

`os`:访问和操作操作系统

目录


os 是 Python 与操作系统交互的老牌标准库:环境变量、路径、文件/目录、
权限、进程信息。但日常文件/目录操作强烈建议用 pathlib——更面向对象、
跨平台更稳。os 主要在“操作进程/环境变量/系统信息”时仍是首选。

完整版:读取目录下的所有内容 重点用 pathlib。


1. 导入

import os

很多 os.path.* 已经在 Python 3.6+ 被 pathlib.Path 替代。新代码优先
pathlib,只在需要时混用 os
。


2. 进程与环境

2.1 环境变量

home = os.environ.get("HOME", "/tmp")         # 推荐
os.environ["FOO"] = "bar"                       # 进程内可见
os.environ.pop("FOO", None)                     # 删除

真正要做“跨平台”配置时,把环境变量写进 .env,用 python-dotenv 加载。

2.2 当前工作目录

os.getcwd()                # 拿到当前路径
os.chdir("/tmp")           # 切换

pathlib.Path.cwd() 是面向对象版本。

2.3 进程信息

os.getpid()                # 当前进程 PID
os.getlogin()              # 当前登录用户名(Unix)
os.cpu_count()             # 逻辑 CPU 核数
os.uname()                 # 系统信息(Unix)

3. 文件与目录

3.1 os.path(旧但仍有用)

函数 作用
os.path.join(a, b) 路径拼接(用 / 或 \)
os.path.basename(p) 拿文件名
os.path.dirname(p) 拿目录
os.path.splitext(p) 拆扩展名(("a", ".txt"))
os.path.exists(p) 是否存在
os.path.isfile(p) 是否是文件
os.path.isdir(p) 是否是目录
os.path.getsize(p) 文件大小(字节)
os.path.abspath(p) 绝对路径
os.path.relpath(p, start) 相对路径
p = "/home/user/project/script.py"
os.path.dirname(p)        # /home/user/project
os.path.basename(p)       # script.py
os.path.splitext(p)       # ('/home/user/project/script', '.py')
os.path.relpath("/a/b/c", "/a")   # b/c

3.2 pathlib(推荐)

from pathlib import Path

p = Path("data") / "x.txt"
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text("hi", encoding="utf-8")

Path 是 os.path 的完全替代 + 还能直接 open / read_text / glob /
rglob,跨平台更稳。

3.3 目录创建 / 删除

os.mkdir("new")                # 单级;已存在抛 FileExistsError
os.makedirs("a/b/c", exist_ok=True)   # 多级
os.rmdir("empty")              # 只能删空目录
os.removedirs("a/b/c")         # 删空目录链

更现代:

from pathlib import Path
Path("a/b/c").mkdir(parents=True, exist_ok=True)
Path("a").rmdir()                          # 空目录
import shutil; shutil.rmtree("a")          # 递归删

3.4 列出 / 遍历目录

os.listdir(".")                       # 浅列出(含文件和子目录名)
for dirpath, dirs, files in os.walk("."):     # 递归
    ...

pathlib.Path.rglob("*") 是更现代的递归遍历。

3.5 重命名 / 删除

os.rename("a.txt", "b.txt")
os.replace("a.txt", "b.txt")          # 跨平台,跨设备也安全
os.remove("a.txt")                    # 单文件
os.unlink("a.txt")                    # 同上

4. 文件信息 / 权限

4.1 os.stat

st = os.stat("README.md")
st.st_size                # 字节
st.st_mtime               # 最后修改时间(时间戳)
st.st_uid / st.st_gid     # 所有者 / 组(Unix)
st.st_mode                # 权限位

Path.stat() 是更 OOP 的版本。

4.2 权限

os.chmod("script.sh", 0o755)
os.chown("file", uid=1000, gid=1000)         # Unix
os.access("file", os.R_OK)                  # 是否可读

4.3 符号链接

os.symlink("target", "link")                # 创建
os.readlink("link")                         # 读目标
os.path.islink("link")                      # 是否是软链

5. 进程与执行

5.1 简单调用

os.system("ls -l")              # 不取输出

5.2 推荐的现代写法:subprocess

import subprocess
r = subprocess.run(
    ["ls", "-l", "/tmp"],
    capture_output=True, text=True, timeout=5, check=True,
)
print(r.stdout)

详见 调用 Linux Shell 命令。


6. 路径中特殊字符 / 跨平台

os.sep            # '/' 或 '\\'
os.extsep         # '.'
os.linesep        # '\n' 或 '\r\n'
os.name           # 'posix' / 'nt'

真要写跨平台代码,就让 pathlib 帮你处理。


7. 完整示例:批量重命名

from pathlib import Path

root = Path("photos")
for p in root.glob("*.jpg"):
    new = p.with_name(p.stem + "_processed.jpg")
    p.replace(new)

8. 常见问题

  • 跨平台路径分隔:永远用 os.path.join / Path /,不要 写
    os.path.join(a, b + "/c")。
  • os.path.exists 在软链上会跟随到目标;os.path.islink 才能判断是不是
    软链。
  • Windows 编码:写文件时显式 encoding="utf-8",否则可能 gbk 出乱码。
  • os.remove 删目录? 不行,会抛 IsADirectoryError;用 shutil.rmtree。

9. 选型

需求 推荐
文件 / 目录操作 pathlib.Path
临时复杂 IO shutil(copy2 / rmtree)
环境变量、进程信息、权限 os
调用外部命令 subprocess
跨平台目录递归 Path.rglob
大文件监控 watchdog

10. 小结

  • os 提供进程 / 环境 / 系统调用一类的接口,是 Python 与 OS 的桥梁。
  • 日常文件 / 目录操作,优先 pathlib:Path 比 os.path 更好用、更安全。
  • 涉及“执行外部命令”用 subprocess,别用 os.system。
  • 涉及“复制整个目录 / 递归删”用 shutil。
  • 写跨平台代码时,把路径全交给 pathlib,分隔符让它自己处理。