Appearance
Python OS 模块
Python 的 os 模块提供了与操作系统交互的功能,包括文件和目录操作、环境变量管理、进程管理等。本章节将详细介绍 os 模块的常用功能和使用方法。
导入 os 模块
要使用 os 模块,首先需要导入它:
python
import os文件和目录操作
路径操作
os.path 子模块
os.path 子模块提供了路径操作相关的功能。
| 函数 | 描述 |
|---|---|
os.path.abspath(path) | 返回路径的绝对路径 |
os.path.basename(path) | 返回路径的基本名称 |
os.path.dirname(path) | 返回路径的目录名称 |
os.path.exists(path) | 检查路径是否存在 |
os.path.isfile(path) | 检查路径是否为文件 |
os.path.isdir(path) | 检查路径是否为目录 |
os.path.join(path1, path2, ...) | 连接多个路径组件 |
os.path.split(path) | 分割路径为目录和文件名 |
os.path.splitext(path) | 分割路径为文件名和扩展名 |
os.path.getsize(path) | 获取文件大小 |
os.path.getmtime(path) | 获取文件最后修改时间 |
os.path.getctime(path) | 获取文件创建时间 |
示例:
python
import os
import time
# 路径操作
test_path = "example.txt"
# 获取绝对路径
abs_path = os.path.abspath(test_path)
print(f"绝对路径: {abs_path}")
# 获取目录名称
dir_name = os.path.dirname(abs_path)
print(f"目录名称: {dir_name}")
# 获取基本名称
base_name = os.path.basename(abs_path)
print(f"基本名称: {base_name}")
# 分割路径
dir_part, file_part = os.path.split(abs_path)
print(f"目录部分: {dir_part}")
print(f"文件部分: {file_part}")
# 分割扩展名
name_part, ext_part = os.path.splitext(base_name)
print(f"名称部分: {name_part}")
print(f"扩展名部分: {ext_part}")
# 检查路径是否存在
print(f"路径是否存在: {os.path.exists(test_path)}")
# 检查是否为文件
print(f"是否为文件: {os.path.isfile(test_path)}")
# 检查是否为目录
print(f"是否为目录: {os.path.isdir(test_path)}")
# 连接路径
new_path = os.path.join(dir_name, "new", "file.txt")
print(f"连接后的路径: {new_path}")
# 获取文件大小
if os.path.isfile(test_path):
size = os.path.getsize(test_path)
print(f"文件大小: {size} 字节")
# 获取文件修改时间
if os.path.isfile(test_path):
mtime = os.path.getmtime(test_path)
print(f"最后修改时间: {time.ctime(mtime)}")
# 获取文件创建时间
if os.path.isfile(test_path):
ctime = os.path.getctime(test_path)
print(f"创建时间: {time.ctime(ctime)}")目录操作
| 函数 | 描述 |
|---|---|
os.getcwd() | 获取当前工作目录 |
os.chdir(path) | 改变当前工作目录 |
os.mkdir(path, mode=0o777) | 创建单级目录 |
os.makedirs(path, mode=0o777, exist_ok=False) | 创建多级目录 |
os.rmdir(path) | 删除单级空目录 |
os.removedirs(path) | 删除多级空目录 |
os.listdir(path) | 列出目录内容 |
示例:
python
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")
# 改变当前工作目录
try:
os.chdir("..")
print(f"改变后的工作目录: {os.getcwd()}")
os.chdir(current_dir) # 改回原目录
print(f"改回原目录: {os.getcwd()}")
except Exception as e:
print(f"改变目录失败: {e}")
# 创建单级目录
test_dir = "test_dir"
try:
if not os.path.exists(test_dir):
os.mkdir(test_dir)
print(f"目录 {test_dir} 创建成功")
else:
print(f"目录 {test_dir} 已存在")
except Exception as e:
print(f"创建目录失败: {e}")
# 创建多级目录
multi_dir = "dir1/dir2/dir3"
try:
if not os.path.exists(multi_dir):
os.makedirs(multi_dir, exist_ok=True)
print(f"多级目录 {multi_dir} 创建成功")
else:
print(f"多级目录 {multi_dir} 已存在")
except Exception as e:
print(f"创建多级目录失败: {e}")
# 列出目录内容
print(f"目录 {current_dir} 的内容:")
for item in os.listdir(current_dir):
print(f" - {item}")
# 删除目录
try:
if os.path.exists(test_dir):
os.rmdir(test_dir)
print(f"目录 {test_dir} 删除成功")
if os.path.exists(multi_dir):
os.removedirs(multi_dir) # 只能删除空目录
print(f"多级目录 {multi_dir} 删除成功")
except Exception as e:
print(f"删除目录失败: {e}")文件操作
| 函数 | 描述 |
|---|---|
os.rename(src, dst) | 重命名文件或目录 |
os.remove(path) | 删除文件 |
os.unlink(path) | 删除文件(与 remove 相同) |
os.replace(src, dst) | 替换文件 |
os.symlink(src, dst) | 创建符号链接 |
os.link(src, dst) | 创建硬链接 |
示例:
python
import os
# 创建测试文件
with open("test.txt", "w") as f:
f.write("Hello, World!")
print("测试文件创建成功")
# 重命名文件
try:
os.rename("test.txt", "renamed_test.txt")
print("文件重命名成功")
except Exception as e:
print(f"文件重命名失败: {e}")
# 替换文件
try:
with open("new_file.txt", "w") as f:
f.write("New content")
os.replace("new_file.txt", "renamed_test.txt")
print("文件替换成功")
except Exception as e:
print(f"文件替换失败: {e}")
# 删除文件
try:
if os.path.exists("renamed_test.txt"):
os.remove("renamed_test.txt")
print("文件删除成功")
except Exception as e:
print(f"文件删除失败: {e}")环境变量
| 函数 | 描述 |
|---|---|
os.environ | 环境变量字典 |
os.getenv(key, default=None) | 获取环境变量 |
os.putenv(key, value) | 设置环境变量 |
os.unsetenv(key) | 删除环境变量 |
示例:
python
import os
# 查看环境变量字典
print("环境变量字典:")
for key, value in os.environ.items():
if key in ['PATH', 'HOME', 'USER', 'PYTHONPATH']:
print(f" {key}: {value}")
# 获取特定环境变量
path = os.getenv('PATH')
print(f"\nPATH 环境变量: {path}")
# 获取不存在的环境变量(带默认值)
non_existent = os.getenv('NON_EXISTENT_VAR', '默认值')
print(f"不存在的环境变量: {non_existent}")
# 设置环境变量(注意:此设置仅在当前进程有效)
os.putenv('MY_VAR', 'my_value')
print(f"设置的环境变量: {os.getenv('MY_VAR')}")系统信息
| 函数 | 描述 |
|---|---|
os.name | 操作系统名称 |
os.uname() | 系统信息(仅 Unix 系统) |
os.sep | 路径分隔符 |
os.pathsep | 环境变量路径分隔符 |
os.linesep | 换行符 |
os.curdir | 当前目录符号 |
os.pardir | 父目录符号 |
示例:
python
import os
# 操作系统名称
print(f"操作系统名称: {os.name}")
# 系统信息(仅 Unix 系统)
try:
uname_info = os.uname()
print(f"系统信息: {uname_info}")
except AttributeError:
print("os.uname() 仅在 Unix 系统可用")
# 路径分隔符
print(f"路径分隔符: {os.sep}")
# 环境变量路径分隔符
print(f"环境变量路径分隔符: {os.pathsep}")
# 换行符
print(f"换行符: {repr(os.linesep)}")
# 当前目录符号
print(f"当前目录符号: {os.curdir}")
# 父目录符号
print(f"父目录符号: {os.pardir}")进程管理
| 函数 | 描述 |
|---|---|
os.system(command) | 执行系统命令 |
os.popen(command, mode='r', buffering=-1) | 执行系统命令并返回文件对象 |
os.fork() | 创建子进程(仅 Unix 系统) |
os.exec*() | 执行新程序 |
os.wait() | 等待子进程结束(仅 Unix 系统) |
os.kill(pid, signal) | 发送信号给进程 |
os.getpid() | 获取当前进程 ID |
os.getppid() | 获取父进程 ID |
示例:
python
import os
# 执行系统命令
print("执行系统命令 'dir'(Windows)或 'ls -l'(Unix):")
if os.name == 'nt': # Windows
os.system('dir')
else: # Unix
os.system('ls -l')
# 执行系统命令并获取输出
print("\n执行系统命令并获取输出:")
if os.name == 'nt':
result = os.popen('dir').read()
else:
result = os.popen('ls -l').read()
print(result)
# 获取当前进程 ID
print(f"当前进程 ID: {os.getpid()}")
# 获取父进程 ID
print(f"父进程 ID: {os.getppid()}")文件权限和状态
| 函数 | 描述 |
|---|---|
os.chmod(path, mode) | 修改文件权限 |
os.chown(path, uid, gid) | 修改文件所有者和组 |
os.stat(path) | 获取文件状态 |
os.lstat(path) | 获取文件状态(不跟随符号链接) |
示例:
python
import os
import stat
# 创建测试文件
with open("perm_test.txt", "w") as f:
f.write("Test content")
print("测试文件创建成功")
# 获取文件状态
file_stat = os.stat("perm_test.txt")
print(f"文件状态: {file_stat}")
print(f"文件大小: {file_stat.st_size} 字节")
print(f"文件权限: {oct(file_stat.st_mode)[-4:]}")
print(f"最后访问时间: {file_stat.st_atime}")
print(f"最后修改时间: {file_stat.st_mtime}")
print(f"最后状态改变时间: {file_stat.st_ctime}")
# 修改文件权限(仅 Unix 系统)
try:
if os.name != 'nt': # 非 Windows 系统
# 添加执行权限
os.chmod("perm_test.txt", file_stat.st_mode | stat.S_IXUSR)
new_stat = os.stat("perm_test.txt")
print(f"修改后的文件权限: {oct(new_stat.st_mode)[-4:]}")
except Exception as e:
print(f"修改文件权限失败: {e}")
# 删除测试文件
os.remove("perm_test.txt")
print("测试文件删除成功")实用工具函数
| 函数 | 描述 |
|---|---|
os.walk(top, topdown=True, onerror=None, followlinks=False) | 遍历目录树 |
os.scandir(path) | 高效地扫描目录 |
os.fspath(path) | 将对象转换为文件系统路径 |
os.makedirs(name, mode=0o777, exist_ok=False) | 创建多级目录 |
os.removedirs(name) | 删除多级空目录 |
示例:
python
import os
# 遍历目录树
print("遍历当前目录树:")
for root, dirs, files in os.walk('.'):
print(f"\n目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
# 限制深度,避免输出过多
if len(root.split(os.sep)) - len(os.getcwd().split(os.sep)) > 2:
dirs.clear() # 清空 dirs 列表,停止遍历更深层次
# 使用 scandir 扫描目录(更高效)
print("\n使用 scandir 扫描当前目录:")
with os.scandir('.') as entries:
for entry in entries:
if entry.is_file():
print(f"文件: {entry.name}")
elif entry.is_dir():
print(f"目录: {entry.name}")
# 创建和删除多级目录
print("\n创建和删除多级目录:")
multi_dir = "level1/level2/level3"
os.makedirs(multi_dir, exist_ok=True)
print(f"创建多级目录: {multi_dir}")
# 检查目录是否存在
print(f"目录是否存在: {os.path.exists(multi_dir)}")
# 删除多级目录
os.removedirs(multi_dir)
print(f"删除多级目录: {multi_dir}")
print(f"目录是否存在: {os.path.exists(multi_dir)}")实际应用示例
示例 1:批量重命名文件
python
# 批量重命名文件
def batch_rename(directory, old_ext, new_ext):
"""批量重命名文件扩展名"""
try:
for filename in os.listdir(directory):
# 检查文件是否以旧扩展名为结尾
if filename.endswith(old_ext):
# 构建新文件名
new_filename = filename[:-len(old_ext)] + new_ext
# 构建完整路径
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_filename)
# 重命名文件
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_filename}")
print("批量重命名完成")
except Exception as e:
print(f"批量重命名失败: {e}")
# 测试
# batch_rename('.', '.txt', '.md')示例 2:查找特定文件
python
# 查找特定文件
def find_files(directory, extension):
"""查找指定扩展名的文件"""
found_files = []
try:
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(extension):
found_files.append(os.path.join(root, file))
print(f"找到 {len(found_files)} 个 .{extension} 文件:")
for file in found_files:
print(f" - {file}")
return found_files
except Exception as e:
print(f"查找文件失败: {e}")
return []
# 测试
# find_files('.', 'py')示例 3:计算目录大小
python
# 计算目录大小
def get_directory_size(directory):
"""计算目录大小"""
total_size = 0
try:
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
try:
total_size += os.path.getsize(file_path)
except Exception:
# 忽略无法访问的文件
pass
print(f"目录 {directory} 的大小: {total_size} 字节")
print(f"目录 {directory} 的大小: {total_size / 1024:.2f} KB")
print(f"目录 {directory} 的大小: {total_size / (1024 * 1024):.2f} MB")
return total_size
except Exception as e:
print(f"计算目录大小失败: {e}")
return 0
# 测试
# get_directory_size('.')示例 4:清理临时文件
python
# 清理临时文件
def clean_temp_files(directory, extensions=None, days=7):
"""清理临时文件"""
import time
current_time = time.time()
cutoff_time = current_time - (days * 24 * 60 * 60)
deleted_count = 0
try:
for root, dirs, files in os.walk(directory):
for file in files:
# 检查文件扩展名
if extensions and not any(file.endswith(ext) for ext in extensions):
continue
file_path = os.path.join(root, file)
try:
# 检查文件修改时间
mtime = os.path.getmtime(file_path)
if mtime < cutoff_time:
os.remove(file_path)
deleted_count += 1
print(f"删除临时文件: {file_path}")
except Exception:
# 忽略无法访问的文件
pass
print(f"清理完成,删除了 {deleted_count} 个临时文件")
except Exception as e:
print(f"清理临时文件失败: {e}")
# 测试
# clean_temp_files('.', ['.tmp', '.log', '.pyc'], 7)示例 5:备份目录
python
# 备份目录
def backup_directory(src_dir, dst_dir):
"""备份目录"""
import shutil
try:
# 检查源目录是否存在
if not os.path.exists(src_dir):
print(f"源目录 {src_dir} 不存在")
return
# 创建目标目录
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"创建目标目录: {dst_dir}")
# 复制文件
for item in os.listdir(src_dir):
src_path = os.path.join(src_dir, item)
dst_path = os.path.join(dst_dir, item)
if os.path.isdir(src_path):
# 递归复制目录
shutil.copytree(src_path, dst_path, dirs_exist_ok=True)
print(f"复制目录: {item}")
else:
# 复制文件
shutil.copy2(src_path, dst_path)
print(f"复制文件: {item}")
print(f"目录备份完成: {src_dir} -> {dst_dir}")
except Exception as e:
print(f"备份目录失败: {e}")
# 测试
# backup_directory('.', './backup')总结
Python 的 os 模块提供了丰富的与操作系统交互的功能,包括:
- 文件和目录操作:创建、删除、重命名、复制文件和目录
- 路径操作:处理文件路径、获取路径信息
- 环境变量管理:获取、设置环境变量
- 系统信息:获取操作系统信息、路径分隔符等
- 进程管理:执行系统命令、获取进程信息
- 文件权限和状态:修改文件权限、获取文件状态
掌握 os 模块的使用,对于编写与操作系统交互的 Python 程序非常重要。在实际应用中,我们可以结合 os 模块和其他模块(如 shutil、pathlib 等)来完成更复杂的文件和系统操作任务。