在 Python 中,os 是内置的系统交互模块,无需额外安装,直接导入即可使用,它主要用于操作系统交互,专门用来处理文件、目录、路径、系统环境等等。
os 模块封装了不同操作系统(Windows/Linux/Mac)的底层接口,提供统一的文件、目录操作方法,屏蔽系统差异。这样我们在处理文件时就不需要关注操作系统间的差异,如文件路径分隔符,windows 使用“\”,Linux 操作系统使用“/”。
注意:本模块中的所有函数在文件名或路径无效、无法访问,或其他参数类型正确但操作系统不接受的情况下,均会抛出OSError(或其子类)异常。
指在操作系统或运行环境中预先设置、可供程序和系统读取的动态参数,它们不直接写入程序代码,而是以变量形式存在于系统环境中。
简单来说,环境变量相当于系统和应用程序之间的通用配置信息,能够让程序在不同环境下灵活适配,无需修改源代码即可调整运行状态,常见的用途包括指定可执行文件的搜索路径、设置系统默认语言、配置程序运行所需的参数等。
在 Python 中,可以通过如下方法对环境变量进行读取、设置和删除:
os.getenv(key, default=None) 获取环境变量,不存在则返回默认值
os.environ 类似字典的对象,包含所有环境变量
os.environ[key] = value 设置环境变量
del os.environ[key] 删除环境变量
示例:
# 导入 os 模块
import os
# 获取环境变量
print("获取单个环境变量:")
print(f"PATH: {os.getenv('PATH')[:50]}...") # 只显示前50个字符
print(f"USER: {os.getenv('USER', '未知用户')}") # 提供默认值
# 获取所有环境变量
print("\n所有环境变量:")
env_vars = os.environ
print(f"环境变量数量: {len(env_vars)}")
print(f"HOME: {env_vars.get('HOME')}")
# 设置环境变量(仅在当前进程有效)
os.environ['MY_VAR'] = 'my_value'
print(f"\n设置的环境变量 MY_VAR: {os.getenv('MY_VAR')}")
# 删除环境变量
if 'MY_VAR' in os.environ:
del os.environ['MY_VAR']
print(f"删除后 MY_VAR: {os.getenv('MY_VAR')}")运行结果:
获取单个环境变量:
PATH: d:\anaconda3;D:\anaconda3;D:\anaconda3\Library\min...
USER: 未知用户
所有环境变量:
环境变量数量: 122
HOME: None
设置的环境变量 MY_VAR: my_value
删除后 MY_VAR: None目录操作指对文件系统中的目录进行操作,如创建目录、删除目录、获取当前目录等等,Python 中,操作目录的主要方法如下:
os.getcwd() 获取当前工作目录
os.chdir(path) 更改当前工作目录
os.mkdir(path) 创建单个目录
os.makedirs(path, exist_ok=False) 创建多级目录
os.listdir(path='.') 列出目录中的文件和子目录
os.rmdir(path) 删除空目录
示例:
# 导入 os 模块
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
# 创建新目录
new_dir = "test_dir"
try:
os.mkdir(new_dir)
print(f"已创建目录: {new_dir}")
except FileExistsError:
print(f"目录 {new_dir} 已存在")
# 创建多级目录
multi_dir = "parent_dir/child_dir/grandchild_dir"
try:
os.makedirs(multi_dir, exist_ok=True) # exist_ok=True 避免目录存在时出错
print(f"已创建多级目录: {multi_dir}")
except Exception as e:
print(f"创建多级目录出错: {e}")
# 更改工作目录
try:
os.chdir(new_dir)
print(f"当前工作目录已更改至: {os.getcwd()}")
os.chdir(current_dir) # 改回原目录
except FileNotFoundError:
print(f"目录 {new_dir} 不存在")
# 列出目录内容
print(f"\n{current_dir} 目录内容:")
for item in os.listdir(current_dir):
print(f" {item}")
# 删除目录
try:
os.rmdir(new_dir)
print(f"已删除目录: {new_dir}")
except OSError as e:
print(f"删除目录 {new_dir} 失败: {e}")
# 删除多级目录(需确保目录为空)
import shutil
try:
shutil.rmtree("parent_dir")
print("已删除多级目录: parent_dir")
except OSError as e:
print(f"删除多级目录失败: {e}")运行结果:
当前工作目录: d:\$share_dir\workspace\4.learn\Python3\3.modules
已创建目录: test_dir
已创建多级目录: parent_dir/child_dir/grandchild_dir
当前工作目录已更改至: d:\$share_dir\workspace\4.learn\Python3\3.modules\test_dir
d:\$share_dir\workspace\4.learn\Python3\3.modules 目录内容:
basic_data.csv
basic_writer.csv
...
test_dir
tmp.py
users.json
已删除目录: test_dir
已删除多级目录: parent_dir文件操作指直接对文件进行创建、删除、重命名、权限修改等等,Python 提供的关于文件操作的主要方法如下:
os.rename(src, dst) 重命名或移动文件/目录
os.remove(path) 删除文件
os.path.exists(path) 检查路径是否存在
os.path.isfile(path) 检查是否为文件
os.path.isdir(path) 检查是否为目录
os.path.getsize(path) 获取文件大小(字节)
示例:
import os
# 创建文件(通常用open(),这里展示os模块相关功能)
filename = "test_file.txt"
with open(filename, 'w') as f:
f.write("测试文件内容")
# 重命名文件
new_filename = "renamed_file.txt"
try:
os.rename(filename, new_filename)
print(f"文件已重命名: {filename} -> {new_filename}")
except FileNotFoundError:
print(f"文件 {filename} 不存在")
# 移动文件(与重命名类似,可跨目录)
target_dir = "test_move_dir"
os.makedirs(target_dir, exist_ok=True)
target_path = os.path.join(target_dir, new_filename)
os.rename(new_filename, target_path)
print(f"文件已移动至: {target_path}")
# 删除文件
try:
os.remove(target_path)
print(f"已删除文件: {target_path}")
os.rmdir(target_dir) # 同时删除空目录
except OSError as e:
print(f"删除文件失败: {e}")
# 检查文件/目录是否存在
check_file = "existing_file.txt"
print(f"\n文件 {check_file} 是否存在: {os.path.exists(check_file)}")
# 创建临时文件并检查属性
with open(check_file, 'w') as f:
f.write("临时内容")
print(f"{check_file} 是否为文件: {os.path.isfile(check_file)}")
print(f"{check_file} 是否为目录: {os.path.isdir(check_file)}")
print(f"{check_file} 绝对路径: {os.path.abspath(check_file)}")
print(f"{check_file} 大小: {os.path.getsize(check_file)} 字节")
# 最后删除测试文件
os.remove(check_file)运行结果:
文件已重命名: test_file.txt -> renamed_file.txt
文件已移动至: test_move_dir\renamed_file.txt
已删除文件: test_move_dir\renamed_file.txt
文件 existing_file.txt 是否存在: False
existing_file.txt 是否为文件: True
existing_file.txt 是否为目录: False
existing_file.txt 绝对路径: d:\$share_dir\workspace\4.learn\Python3\3.modules\existing_file.txt
existing_file.txt 大小: 12 字节路径处理指在程序开发中,对文件、目录或数据的访问路径进行规范化、拼接、解析、校验与转换的一系列操作。
路径处理通常用于确保路径格式统一、适配不同操作系统的路径规则、避免路径错误或安全风险,同时提升文件定位与数据读取的准确性与稳定性。例如,处理路径分隔符(Windows 使用反斜杠,Linux 使用斜杠),避免用户通过“..”符号访问未授权的目录。
Python 提供用于路径处理的主要方法如下:
os.path.join(path1, path2, ...) 智能拼接路径,在拼接多个路径时,自动处理不同系统的路径分隔符,特别是在 Windows 中,URL 地址使用 / 分隔符,磁盘路径使用 \ 分隔符,将磁盘路径拼接为 URL 地址时可以使用。
os.path.dirname(path) 获取路径中的目录部分
os.path.basename(path) 获取路径中的文件名部分
os.path.splitext(path) 分离文件名和扩展名,返回一个元组,例如 ('report', '.pdf')
os.path.abspath(path) 获取绝对路径,例如 d:\$share_dir\workspace\4.learn\Python3\config.ini
os.path.normpath(path) 规范化路径,自动处理路径中的“.”和“..”
示例:
import os
# 路径拼接(自动处理不同系统的路径分隔符)
dir_name = "data"
file_name = "results.txt"
full_path = os.path.join(dir_name, file_name)
print(f"拼接路径: {full_path}")
# 路径分解
path = "/home/user/docs/report.pdf"
print(f"\n分解路径: {path}")
print(f"目录部分: {os.path.dirname(path)}")
print(f"文件名部分: {os.path.basename(path)}")
print(f"文件名和扩展名: {os.path.splitext(os.path.basename(path))}")
# 绝对路径
relative_path = "../config.ini"
print(f"\n相对路径: {relative_path}")
print(f"绝对路径: {os.path.abspath(relative_path)}")
# 规范化路径(处理.和..)
messy_path = "/home/user/../docs/./report.pdf"
print(f"不规范路径: {messy_path}")
print(f"规范化路径: {os.path.normpath(messy_path)}")
# 跨平台路径处理
print(f"\n当前系统路径分隔符: {os.sep}")
print(f"当前系统行终止符: {repr(os.linesep)}")运行结果:
拼接路径: data\results.txt
分解路径: /home/user/docs/report.pdf
目录部分: /home/user/docs
文件名部分: report.pdf
文件名和扩展名: ('report', '.pdf')
相对路径: ../config.ini
绝对路径: d:\$share_dir\workspace\4.learn\Python3\config.ini
不规范路径: /home/user/../docs/./report.pdf
规范化路径: \home\docs\report.pdf
当前系统路径分隔符: \
当前系统行终止符: '\r\n'Python 中的进程是操作系统进行资源分配和调度的基本单位,每个进程拥有独立的内存空间、文件描述符等系统资源,确保不同任务之间的隔离性。与线程不同,进程的多任务执行可真正利用多核 CPU 的并行能力,有效突破 Python 全局解释器锁(GIL)对计算密集型任务的限制,尤其适用于大数据处理、批量任务执行、CPU密集型运算等场景。
Python 中,os 模块关于进程的主要方法如下:
os.getpid() 获取当前进程ID
os.getppid() 获取父进程ID
os.system(command) 执行系统命令,返回退出状态
os.popen(command) 执行系统命令,返回文件对象以读取输出
示例:
import os
import time
# 获取当前进程ID
print(f"当前进程ID: {os.getpid()}")
# 获取父进程ID
print(f"父进程ID: {os.getppid()}")
# 在Windows和Unix上执行系统命令
try:
if os.name == 'nt': # Windows系统
# 执行dir命令并获取输出
os.system('dir')
else: # Unix/Linux/Mac系统
# 执行ls命令并获取输出
os.system('ls -l')
except Exception as e:
print(f"执行命令出错: {e}")
# 使用os.popen获取命令输出
print("\n使用os.popen获取命令输出:")
try:
if os.name == 'nt':
with os.popen('echo %USERNAME%') as f:
print(f"当前用户: {f.read().strip()}")
else:
with os.popen('echo $USER') as f:
print(f"当前用户: {f.read().strip()}")
except Exception as e:
print(f"获取命令输出出错: {e}")
# 注意:更推荐使用 subprocess 模块进行进程管理运行结果:
当前进程ID: 15452
父进程ID: 14048
使用os.popen获取命令输出:
当前用户: Administratoros 模块使用注意事项:
(1)跨平台兼容性:不同操作系统(Windows、Linux、macOS)的路径分隔符、环境变量等存在差异。尽量使用 os.path 模块的方法处理路径,而非硬编码 / 或 \。使用 os.name 判断操作系统类型('nt' 表示 Windows,'posix' 表示 Unix 类系统)
(2)错误处理:文件和目录操作可能抛出多种异常(FileNotFoundError、PermissionError 等),进行文件操作时应使用 try-except 块捕获异常
(3)安全性:使用 os.system() 或 os.popen() 执行外部命令时要注意安全风险,避免将用户输入直接传递给这些命令,以防命令注入攻击
(4)替代模块:
pathlib 模块提供了面向对象的路径处理方式,是 os.path 的现代替代
subprocess 模块比 os.system() 和 os.popen() 更强大,推荐用于进程管理
shutil 模块提供了更高级的文件操作功能
注意:os 模块是 Python 与操作系统交互的基础,掌握其常用方法对于文件处理、系统管理脚本编写等任务非常重要。
更多关于 os 模块的信息请参考 https://docs.python.org/3/library/os.html 文档。