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)
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,分隔符让它自己处理。