Skip to content

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 模块提供了丰富的与操作系统交互的功能,包括:

  1. 文件和目录操作:创建、删除、重命名、复制文件和目录
  2. 路径操作:处理文件路径、获取路径信息
  3. 环境变量管理:获取、设置环境变量
  4. 系统信息:获取操作系统信息、路径分隔符等
  5. 进程管理:执行系统命令、获取进程信息
  6. 文件权限和状态:修改文件权限、获取文件状态

掌握 os 模块的使用,对于编写与操作系统交互的 Python 程序非常重要。在实际应用中,我们可以结合 os 模块和其他模块(如 shutilpathlib 等)来完成更复杂的文件和系统操作任务。