1. 引言
Python 的 os 模块是标准库中用于与操作系统交互的核心模块之一。它提供了丰富的函数来执行文件和目录操作、进程管理、环境变量访问等系统级任务。无论是编写简单的脚本还是复杂的应用程序,掌握 os 模块都是 Python 开发者的必备技能。
本文将详细介绍 os 模块的主要功能,包括文件与目录操作、路径处理、环境变量管理以及跨平台兼容性等内容,并提供实用的代码示例。
2. os模块基础
2.1 导入模块
python
import os
2.2 常用子模块
os 模块包含多个子模块,其中最常用的是:
os.path:专门用于路径操作os.environ:环境变量访问os.system:执行系统命令
3. 文件与目录操作
3.1 获取当前工作目录
python
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
3.2 改变工作目录
python
# 改变工作目录
os.chdir('/path/to/new/directory')
print(f"新工作目录: {os.getcwd()}")
3.3 列出目录内容
python
# 列出目录中的所有文件和子目录
contents = os.listdir('.')
print(f"当前目录内容: {contents}")
# 使用 os.scandir() 获取更详细的信息(推荐)
with os.scandir('.') as entries:
for entry in entries:
print(f"{entry.name} - 是目录: {entry.is_dir()}")
3.4 创建和删除目录
python
# 创建单个目录
os.mkdir('new_directory')
# 创建多级目录
os.makedirs('parent/child/grandchild', exist_ok=True)
# 删除空目录
os.rmdir('new_directory')
# 删除多级目录(谨慎使用)
import shutil
shutil.rmtree('parent') # 需要导入 shutil 模块
3.5 文件操作
python
# 重命名文件或目录
os.rename('old_name.txt', 'new_name.txt')
# 删除文件
os.remove('file_to_delete.txt')
# 检查文件或目录是否存在
if os.path.exists('some_file.txt'):
print("文件存在")
else:
print("文件不存在")
4. 路径操作(os.path子模块)
os.path 是处理文件路径的强大工具,它自动处理不同操作系统的路径分隔符差异。
4.1 路径拼接与分解
python
import os.path
# 路径拼接(跨平台安全)
full_path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"完整路径: {full_path}")
# 分解路径
dirname = os.path.dirname(full_path) # 'folder/subfolder'
basename = os.path.basename(full_path) # 'file.txt'
split_result = os.path.split(full_path) # ('folder/subfolder', 'file.txt')
print(f"目录部分: {dirname}")
print(f"文件名部分: {basename}")
print(f"拆分结果: {split_result}")
4.2 路径信息获取
python
# 获取绝对路径
abs_path = os.path.abspath('relative/path/file.txt')
# 获取文件大小(字节)
file_size = os.path.getsize('file.txt')
print(f"文件大小: {file_size} 字节")
# 获取文件最后修改时间
mod_time = os.path.getmtime('file.txt')
from datetime import datetime
print(f"最后修改: {datetime.fromtimestamp(mod_time)}")
# 检查路径类型
print(f"是文件: {os.path.isfile('file.txt')}")
print(f"是目录: {os.path.isdir('folder')}")
print(f"是链接: {os.path.islink('link.txt')}")
4.3 路径规范化
python
# 规范化路径(处理 . 和 ..)
norm_path = os.path.normpath('folder/../folder/./file.txt')
print(f"规范化路径: {norm_path}")
# 获取真实路径(解析符号链接)
real_path = os.path.realpath('link_to_file.txt')
5. 环境变量管理
5.1 访问环境变量
python
# 获取所有环境变量
env_vars = os.environ
print(f"环境变量数量: {len(env_vars)}")
# 获取特定环境变量
home_dir = os.environ.get('HOME') # Linux/macOS
user_profile = os.environ.get('USERPROFILE') # Windows
path_var = os.environ.get('PATH')
print(f"家目录: {home_dir or user_profile}")
print(f"PATH变量: {path_var}")
5.2 设置环境变量
python
# 设置环境变量(当前进程有效)
os.environ['MY_VARIABLE'] = 'my_value'
# 检查设置是否成功
print(f"MY_VARIABLE: {os.environ.get('MY_VARIABLE')}")
6. 执行系统命令
6.1 简单命令执行
python
# 执行系统命令(返回退出状态码)
exit_code = os.system('ls -la' if os.name != 'nt' else 'dir')
print(f"命令退出码: {exit_code}")
6.2 获取命令输出
python
import subprocess # 更推荐使用 subprocess 模块
# 获取命令输出
result = subprocess.run(['ls', '-la'], capture_output=True, text=True)
print(f"命令输出:\n{result.stdout}")
7. 跨平台兼容性
7.1 操作系统检测
python
# 获取操作系统名称
print(f"操作系统: {os.name}") # 'posix', 'nt', 'java'
# 更精确的平台检测
import platform
print(f"系统平台: {platform.system()}") # 'Linux', 'Windows', 'Darwin'
print(f"平台版本: {platform.release()}")
7.2 路径分隔符
python
# 路径分隔符常量
print(f"路径分隔符: {os.path.sep}")
print(f"路径分隔符列表: {os.pathsep}")
print(f"行结束符: {repr(os.linesep)}")
# 使用 os.path.join 自动处理分隔符
path = os.path.join('usr', 'local', 'bin')
print(f"跨平台路径: {path}")
8. 进程管理
8.1 进程信息
python
# 获取当前进程ID
pid = os.getpid()
print(f"当前进程ID: {pid}")
# 获取父进程ID
ppid = os.getppid()
print(f"父进程ID: {ppid}")
# 获取当前用户ID
uid = os.getuid() if hasattr(os, 'getuid') else None
print(f"用户ID: {uid}")
8.2 进程控制
python
# 创建子进程(Unix-like 系统)
if hasattr(os, 'fork'):
pid = os.fork()
if pid == 0:
print("这是子进程")
os._exit(0)
else:
print(f"这是父进程,子进程ID: {pid}")
9. 实用示例
9.1 遍历目录树
python
def list_files_recursively(directory):
"""递归列出目录中的所有文件"""
file_list = []
for root, dirs, files in os.walk(directory):
for file in files:
full_path = os.path.join(root, file)
file_list.append(full_path)
return file_list
# 使用示例
all_files = list_files_recursively('.')
print(f"找到 {len(all_files)} 个文件")
9.2 批量重命名文件
python
def batch_rename_files(directory, old_ext, new_ext):
"""批量修改文件扩展名"""
for filename in os.listdir(directory):
if filename.endswith(old_ext):
old_path = os.path.join(directory, filename)
new_name = filename.replace(old_ext, new_ext)
new_path = os.path.join(directory, new_name)
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_name}")
# 使用示例
# batch_rename_files('./docs', '.txt', '.md')
9.3 创建项目目录结构
python
def create_project_structure(project_name):
"""创建标准的项目目录结构"""
directories = [
project_name,
os.path.join(project_name, 'src'),
os.path.join(project_name, 'tests'),
os.path.join(project_name, 'docs'),
os.path.join(project_name, 'data'),
os.path.join(project_name, 'logs'),
]
for directory in directories:
os.makedirs(directory, exist_ok=True)
print(f"创建目录: {directory}")
# 创建基础文件
files = [
os.path.join(project_name, 'README.md'),
os.path.join(project_name, 'requirements.txt'),
os.path.join(project_name, '.gitignore'),
]
for file_path in files:
with open(file_path, 'w') as f:
f.write('# ' + os.path.basename(file_path) + '\n')
print(f"创建文件: {file_path}")
# 使用示例
# create_project_structure('my_project')
10. 注意事项与最佳实践
10.1 错误处理
python
import os
import errno
def safe_remove(filepath):
"""安全删除文件,避免异常"""
try:
os.remove(filepath)
print(f"成功删除: {filepath}")
except OSError as e:
if e.errno != errno.ENOENT: # 文件不存在不是错误
print(f"删除失败: {e}")
else:
print(f"文件不存在: {filepath}")
10.2 路径安全性
python
def is_safe_path(base_path, target_path):
"""检查目标路径是否在基础路径内(防止路径遍历攻击)"""
base = os.path.abspath(base_path)
target = os.path.abspath(target_path)
return os.path.commonpath([base, target]) == base
# 使用示例
if is_safe_path('/safe/directory', '/safe/directory/sub/file.txt'):
print("路径安全")
else:
print("路径不安全!")
10.3 性能考虑
- 使用
os.scandir()代替os.listdir():os.scandir()在遍历大目录时性能更好 - 避免频繁的
os.path.exists()调用:在竞争条件下,文件状态可能在你检查后立即改变 - 使用
os.walk()进行递归遍历:比自己实现递归更高效
11. 总结
Python 的 os 模块提供了强大的系统交互能力,是文件操作、目录管理、环境变量访问等任务的基石。通过本文的介绍,你应该已经掌握了:
- 基础操作:目录创建、文件重命名、路径处理
- 高级功能:环境变量管理、进程控制、跨平台兼容
- 最佳实践:错误处理、路径安全、性能优化
在实际开发中,建议结合 pathlib 模块(Python 3.4+)使用,它提供了更面向对象的路径操作方式。但 os 模块仍然是处理低级系统操作的重要工具。
记住:在进行文件系统操作时,始终要考虑错误处理、权限问题和跨平台兼容性,这样才能编写出健壮可靠的 Python 代码。