Python之os模块(文件和目录操作、进程管理、环境变量访问)
文章目录
- Python之os模块
- 功能分类速查表
- 文件和目录操作
- `路径操作 (os.path 子模块)`
- 进程管理
- 环境变量和用户信息
- 文件描述符和权限
- 常用示例
- 遍历目录
- 创建目录结构
- 文件操作
- 获取文件信息
- 跨平台路径处理
- 其他补充点
- '\\'转义字符注意事项
- 使用原始字符串(推荐)
- 使用双反斜杠`\\`
- 使用正斜杠 `/`(Python 自动兼容)
- 创建或删除需要判断是否存在
- 创建文件/目录
- 删除文件/目录
- `__pycache__ `缓存目录
- windows打印os.system("dir") 会乱码
- 乱码原因
- 修改控制台编码为 UTF-8(推荐)
Python之os模块
os
模块是 Python 的标准库之一,提供了丰富的操作系统相关功能,包括文件和目录操作、进程管理、环境变量访问等。它允许 Python 程序与操作系统进行交互,实现跨平台的操作系统功能调用。
功能分类速查表
文件和目录操作
功能/属性 | 说明 | 示例 |
---|---|---|
os.getcwd() | 获取当前工作目录 | current_dir = os.getcwd() |
os.chdir(path) | 改变当前工作目录 | os.chdir(‘/new/path’) |
os.listdir(path) | 返回指定目录下的文件和目录列表 | files = os.listdir(‘.’) |
os.mkdir(path) | 创建目录 | os.mkdir(‘new_dir’) |
os.makedirs(path) | 递归创建目录 | os.makedirs(‘dir1/dir2/dir3’) |
os.remove(path) | 删除文件 | os.remove(‘file.txt’) |
os.rmdir(path) | 删除空目录 | os.rmdir(‘empty_dir’) |
os.removedirs(path) | 递归删除空目录 | os.removedirs(‘dir1/dir2’) |
os.rename(src, dst) | 重命名文件或目录 | os.rename(‘old.txt’, ‘new.txt’) |
os.stat(path) | 获取文件/目录状态信息 | info = os.stat(‘file.txt’) |
os.path 子模块 | 提供路径相关操作 | 详见下方 os.path 部分 |
os.walk() | 递归遍历目录树 | for root, dirs, files in os.walk(top_path): |
路径操作 (os.path 子模块)
功能/属性 | 说明 | 示例 |
---|---|---|
os.path.abspath(path) | 返回绝对路径 | abs_path = os.path.abspath(‘file.txt’) |
os.path.basename(path) | 返回路径的最后部分 | os.path.basename(‘/a/b/c.txt’) → ‘c.txt’ |
os.path.dirname(path) | 返回目录部分 | os.path.dirname(‘/a/b/c.txt’) → ‘/a/b’ |
os.path.exists(path) | 检查路径是否存在 | if os.path.exists(‘file.txt’): |
os.path.isfile(path) | 检查是否为文件 | if os.path.isfile(‘file.txt’): |
os.path.isdir(path) | 检查是否为目录 | if os.path.isdir(‘directory’): |
os.path.join(path1, path2) | 智能拼接路径 | os.path.join(‘dir’, ‘sub’, ‘file.txt’) |
os.path.split(path) | 分割路径为目录和文件名 | dir, file = os.path.split(‘/a/b/c.txt’) |
os.path.splitext(path) | 分割文件名和扩展名 | name, ext = os.path.splitext(‘file.txt’) |
os.path.getsize(path) | 获取文件大小(字节) | size = os.path.getsize(‘file.txt’) |
os.path.getmtime(path) | 获取最后修改时间 | mtime = os.path.getmtime(‘file.txt’) |
进程管理
功能/属性 | 说明 | 示例 |
---|---|---|
os.system(command) | 执行系统命令 | os.system(‘ls -l’) |
os.popen(command) | 执行命令并获取输出 | output = os.popen(‘ls’).read() |
os.getpid() | 获取当前进程ID | pid = os.getpid() |
os.getppid() | 获取父进程ID | ppid = os.getppid() |
os.kill(pid, sig) | 向进程发送信号 | os.kill(pid, signal.SIGTERM) |
os._exit(n) | 直接退出进程(不清理) | os._exit(1) |
环境变量和用户信息
功能/属性 | 说明 | 示例 |
---|---|---|
os.environ | 包含环境变量的字典 | home = os.environ[‘HOME’] |
os.getenv(key) | 获取环境变量值 | path = os.getenv(‘PATH’) |
os.putenv(key, value) | 设置环境变量 | os.putenv(‘MY_VAR’, ‘value’) |
os.uname() | 获取系统信息(Unix ) | info = os.uname() |
os.getlogin() | 获取当前登录用户名 | user = os.getlogin() |
os.getuid() | 获取当前用户ID(Unix ) | uid = os.getuid() |
os.getgid() | 获取当前组ID(Unix ) | gid = os.getgid() |
文件描述符和权限
功能/属性 | 说明 | 示例 |
---|---|---|
os.open(path, flags) | 低级文件打开 | fd = os.open(‘file.txt’, os.O_RDWR) |
os.close(fd) | 关闭文件描述符 | os.close(fd) |
os.read(fd, n) | 从文件描述符读取 | data = os.read(fd, 100) |
os.write(fd, str) | 向文件描述符写入 | os.write(fd, b’data’) |
os.chmod(path, mode) | 更改文件权限 | os.chmod(‘file.txt’, 0o755) |
os.access(path, mode) | 检查文件权限 | if os.access(‘file.txt’, os.R_OK): |
- os.open() 和内置的 open() 函数
-
os.open():低级接口,适合特殊需求(如文件锁、原始字节操作)。
-
open():高级接口,适合日常文件读写(自动处理编码、缓冲和资源管理)。
-
优先使用 open()
,除非你有明确的理由需要使用 os.open()
-
- 参考Python之文件操作
常用示例
遍历目录
import osfor root, dirs, files in os.walk('.'):for file in files:print(os.path.join(root, file))
创建目录结构
import osif not os.path.exists('project/data'):os.makedirs('project/data')
文件操作
import os# 复制文件(简单方式)
with open('source.txt', 'rb') as src, open('dest.txt', 'wb') as dst:dst.write(src.read())# 删除文件前检查
if os.path.isfile('old_file.txt'):os.remove('old_file.txt')
获取文件信息
import os
import timefile_stat = os.stat('document.pdf')
print(f"大小: {file_stat.st_size} 字节")
print(f"最后修改: {time.ctime(file_stat.st_mtime)}")
跨平台路径处理
import osconfig_path = os.path.join(os.getenv('HOME'), 'config', 'settings.ini')
print(f"配置文件路径: {config_path}")
其他补充点
'\'转义字符注意事项
使用原始字符串(推荐)
在路径字符串前加 r
,告诉 Python 不要处理转义字符:
print(os.path.isfile(r'D:\pycharm\project01\day04\模块.py'))
# 注意这里的 `r` ↑
使用双反斜杠\\
手动转义每个反斜杠:
print(os.path.isfile('D:\\pycharm\\project01\\day04\\模块.py'))
使用正斜杠 /
(Python 自动兼容)
即使是在 Windows 系统,Python 也支持 / 作为路径分隔符:
print(os.path.isfile('D:/pycharm/project01/day04/模块.py'))
创建或删除需要判断是否存在
创建文件/目录
- 是否需要判断存在?
-
不必须:Python 的创建操作(如 open()、os.makedirs())在目标已存在时可能会报错,但可以通过参数直接覆盖或忽略。
-
推荐做法:
- 文件:使用 ‘w’ 模式直接覆盖,或 ‘x’ 模式确保不覆盖(需捕获 FileExistsError)。
try:with open('file.txt', 'x') as f: # 文件存在时报错f.write('content') except FileExistsError:print("文件已存在,未覆盖")
- 目录:使用 os.makedirs(exist_ok=True) 自动忽略已存在的目录。
import os os.makedirs('my_dir', exist_ok=True) # 目录存在时不报错
-
删除文件/目录
-
是否需要判断存在?
- 不必须:删除前检查存在性可避免异常,但直接捕获异常更简洁(Python 推崇 EAFP 风格)。
-
推荐做法:
- 文件:直接删除 + 捕获 FileNotFoundError。
import o try:os.remove('file.txt') # 文件不存在时报错 except FileNotFoundError:print("文件不存在,无需删除")
- 目录:使用 shutil.rmtree() 递归删除(无视存在性)。
import shutil shutil.rmtree('my_dir', ignore_errors=True) # 目录不存在时不报错
-
性能:
直接操作 + 异常处理的性能通常优于先检查
(尤其在高并发场景)
__pycache__
缓存目录
- 使用
os.listdir()
查看指定目录下的文件和目录列表时,可以看到该目录 - 当导入一个 Python 模块(如 import mymodule)时,Python 会将模块的源代码(.py 文件)编译成字节码(一种优化后的二进制格式),并保存在
__pycache__
目录中
__pycache__
是 Python 用于优化模块加载的缓存目录,无需手动干预,可以安全忽略或删除。 - 作用
-
性能优化:直接加载已编译的字节码比重新解析 .py 文件更快,尤其是对于大型模块。
-
避免重复编译:如果模块未修改,Python 会直接复用字节码,跳过编译步骤。
-
- 一般编辑器/IDE 默认隐藏了它
windows打印os.system(“dir”) 会乱码
乱码原因
-
os.system() 直接调用系统命令,返回的是 系统原生编码(GBK)。
-
如果 Python 或终端尝试用 UTF-8 解码 GBK 内容,就会显示乱码(如 � 或奇怪符号)。
修改控制台编码为 UTF-8(推荐)
在代码开头强制设置终端编码:
import os
import sys# 设置控制台编码为 UTF-8
sys.stdout.reconfigure(encoding='utf-8') # Python 3.7+
os.system("chcp 65001") # Windows 切换到 UTF-8 代码页print(os.system("dir")) # 现在应该正常显示中文