os 模块是 Python 中最重要和常用的标准库之一,提供了与操作系统交互的各种功能。

一、导入 os 模块

import os

二、文件和目录操作

1 路径操作
# 获取当前工作目录(Get Current Working Directory)
current_dir = os.getcwd()
print(f"当前目录: {current_dir}")

# 改变当前工作目录(Change Directory)
os.chdir('/path/to/directory')

# 获取绝对路径
abs_path = os.path.abspath('relative/path')

# 路径拼接(推荐使用)
full_path = os.path.join('dir1', 'dir2', 'file.txt')
# 输出: dir1/dir2/file.txt (Linux) 或 dir1\dir2\file.txt (Windows)

# 路径分割
dirname, filename = os.path.split('/path/to/file.txt')
# dirname = '/path/to', filename = 'file.txt'

# 文件名和扩展名分割
name, ext = os.path.splitext('file.txt')
# name = 'file', ext = '.txt'

# 获取路径的目录部分
directory = os.path.dirname('/path/to/file.txt')
# directory = '/path/to'

# 获取路径的文件名部分
filename = os.path.basename('/path/to/file.txt')
# filename = 'file.txt'
2 文件和目录检测
# 检查路径是否存在
exists = os.path.exists('/path/to/file')

# 检查是否是文件
is_file = os.path.isfile('/path/to/file.txt')

# 检查是否是目录
is_dir = os.path.isdir('/path/to/directory')

# 检查是否是链接
is_link = os.path.islink('/path/to/link')

# 检查路径是否是绝对路径
is_abs = os.path.isabs('/path/to/file')

# 获取文件大小(字节)
size = os.path.getsize('/path/to/file.txt')

# 获取文件最后修改时间(时间戳)
mtime = os.path.getmtime('/path/to/file.txt')

# 获取文件创建时间(时间戳)
ctime = os.path.getctime('/path/to/file.txt')

# 获取文件最后访问时间(时间戳)
atime = os.path.getatime('/path/to/file.txt')
3 文件和目录管理
# 创建目录
os.mkdir('new_directory')  # 创建单级目录
os.makedirs('path/to/nested/directory', exist_ok=True)  # 创建多级目录

# 删除文件
os.remove('file.txt')

# 删除空目录
os.rmdir('empty_directory')

# 删除目录树(包括所有内容)
import shutil
shutil.rmtree('directory_with_content')

# 重命名/移动文件或目录
os.rename('old_name.txt', 'new_name.txt')
os.rename('old_dir', 'new_dir')

# 复制文件(需要 shutil)
import shutil
shutil.copy2('source.txt', 'destination.txt')  # 保留元数据

# 获取目录内容列表
files = os.listdir('.')  # 当前目录所有文件和目录

# 递归遍历目录(推荐使用)
for root, dirs, files in os.walk('/path/to/directory'):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")

三、环境变量和系统信息

1 环境变量操作
# 获取环境变量
home_dir = os.environ.get('HOME')  # Unix/Linux
home_dir = os.environ.get('USERPROFILE')  # Windows

# 获取所有环境变量
for key, value in os.environ.items():
    print(f"{key}: {value}")

# 设置环境变量(当前进程)
os.environ['MY_VAR'] = 'my_value'

# 检查环境变量是否存在
if 'PATH' in os.environ:
    print("PATH 环境变量存在")

# 获取 PATH 环境变量
path_dirs = os.environ.get('PATH', '').split(os.pathsep)
2 系统信息
# 获取操作系统名称
os_name = os.name
# 'posix' (Unix/Linux/Mac), 'nt' (Windows), 'java' (Jython)

# 获取平台详细信息
import platform
print(platform.system())  # 'Windows', 'Linux', 'Darwin'
print(platform.release())  # 系统版本号

# 获取文件系统的分隔符
sep = os.sep  # '/' 或 '\'
path_sep = os.pathsep  # ':' 或 ';'

# 获取行分隔符
line_sep = os.linesep  # '\n' 或 '\r\n'

四、进程管理

1 执行系统命令
# 执行系统命令并获取返回值
exit_code = os.system('ls -l')  # 返回退出状态码

# 执行命令并获取输出(推荐使用 subprocess)
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

# 获取当前进程ID
pid = os.getpid()
print(f"当前进程ID: {pid}")

# 获取父进程ID
ppid = os.getppid()
print(f"父进程ID: {ppid}")
2 进程控制
# 退出程序
os._exit(0)  # 立即退出,不执行清理操作

# 创建子进程(Unix/Linux)
pid = os.fork()
if pid == 0:
    # 子进程
    print("这是子进程")
    os._exit(0)
else:
    # 父进程
    print(f"这是父进程,子进程ID: {pid}")

五、文件权限和属性

1 权限管理
# 改变文件权限(Unix/Linux)
os.chmod('file.txt', 0o755)  # rwxr-xr-x

# 获取文件权限
stat_info = os.stat('file.txt')
permissions = stat_info.st_mode & 0o777

# 改变文件所有者(需要权限)
os.chown('file.txt', uid, gid)  # Unix/Linux

# 获取文件状态信息
stat_info = os.stat('file.txt')
print(f"大小: {stat_info.st_size} 字节")
print(f"最后修改时间: {stat_info.st_mtime}")
print(f"最后访问时间: {stat_info.st_atime}")

六、路径遍历和文件搜索

1 高级文件遍历
# 使用 os.walk() 递归遍历
for root, dirs, files in os.walk('/path/to/directory'):
    # 过滤隐藏文件和目录
    dirs[:] = [d for d in dirs if not d.startswith('.')]
    files = [f for f in files if not f.startswith('.')]
    
    for file in files:
        full_path = os.path.join(root, file)
        print(full_path)

# 使用 os.scandir()(更高效)
with os.scandir('/path/to/directory') as entries:
    for entry in entries:
        if entry.is_file():
            print(f"文件: {entry.name}, 大小: {entry.stat().st_size}")
        elif entry.is_dir():
            print(f"目录: {entry.name}")
2 文件搜索功能
def find_files(directory, pattern=None, file_type='both'):
    """
    查找指定目录下的文件
    
    Args:
        directory: 要搜索的目录
        pattern: 文件名模式(可选)
        file_type: 'file', 'dir', 或 'both'
    """
    results = []
    
    for root, dirs, files in os.walk(directory):
        if file_type in ['file', 'both']:
            for file in files:
                if pattern is None or pattern in file:
                    results.append(os.path.join(root, file))
        
        if file_type in ['dir', 'both']:
            for dir_name in dirs:
                if pattern is None or pattern in dir_name:
                    results.append(os.path.join(root, dir_name))
    
    return results

# 使用示例
pdf_files = find_files('/path/to/docs', '.pdf', 'file')
print(f"找到 {len(pdf_files)} 个PDF文件")

七、实用工具函数

1 路径处理工具
def normalize_path(path):
    """规范化路径,处理 .. 和 ."""
    return os.path.normpath(path)

def ensure_directory_exists(path):
    """确保目录存在,不存在则创建"""
    os.makedirs(path, exist_ok=True)

def get_file_info(file_path):
    """获取文件的详细信息"""
    if not os.path.exists(file_path):
        return None
    
    stat_info = os.stat(file_path)
    return {
        'path': file_path,
        'size': stat_info.st_size,
        'modified': stat_info.st_mtime,
        'created': stat_info.st_ctime,
        'is_file': os.path.isfile(file_path),
        'is_dir': os.path.isdir(file_path)
    }
2 批量文件操作
def batch_rename_files(directory, pattern, replacement):
    """批量重命名文件"""
    renamed_count = 0
    for filename in os.listdir(directory):
        if pattern in filename:
            new_name = filename.replace(pattern, replacement)
            old_path = os.path.join(directory, filename)
            new_path = os.path.join(directory, new_name)
            os.rename(old_path, new_path)
            renamed_count += 1
            print(f"重命名: {filename} -> {new_name}")
    return renamed_count

def find_large_files(directory, size_limit_mb=100):
    """查找大于指定大小的文件"""
    large_files = []
    size_limit = size_limit_mb * 1024 * 1024
    
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            try:
                size = os.path.getsize(file_path)
                if size > size_limit:
                    large_files.append((file_path, size))
            except OSError:
                continue
    
    return sorted(large_files, key=lambda x: x[1], reverse=True)

八、错误处理和最佳实践

1 错误处理
import os
import errno

def safe_file_operation(func, *args, **kwargs):
    """安全的文件操作包装器"""
    try:
        return func(*args, **kwargs)
    except OSError as e:
        if e.errno == errno.ENOENT:
            print("文件或目录不存在")
        elif e.errno == errno.EACCES:
            print("权限不足")
        elif e.errno == errno.ENOSPC:
            print("磁盘空间不足")
        else:
            print(f"操作系统错误: {e}")
        return None

# 使用示例
result = safe_file_operation(os.remove, 'nonexistent.txt')
2 最佳实践
# 1. 总是使用 os.path.join() 而不是字符串拼接
# 错误的方式
path = 'dir1' + '/' + 'dir2' + '/' + 'file.txt'

# 正确的方式
path = os.path.join('dir1', 'dir2', 'file.txt')

# 2. 检查文件是否存在后再操作
if os.path.exists('file.txt'):
    with open('file.txt', 'r') as f:
        content = f.read()
else:
    print("文件不存在")

# 3. 使用 with 语句处理文件
with open('file.txt', 'r') as f:
    content = f.read()

# 4. 处理不同操作系统的路径差异
if os.name == 'nt':  # Windows
    # Windows 特定的处理
    pass
else:  # Unix/Linux
    # Unix 特定的处理
    pass

九、综合示例

import os
import datetime

def analyze_directory(directory):
    """分析目录结构"""
    if not os.path.exists(directory):
        print("目录不存在")
        return
    
    total_files = 0
    total_size = 0
    file_types = {}
    
    for root, dirs, files in os.walk(directory):
        # 跳过隐藏目录
        dirs[:] = [d for d in dirs if not d.startswith('.')]
        
        for file in files:
            # 跳过隐藏文件
            if file.startswith('.'):
                continue
                
            file_path = os.path.join(root, file)
            try:
                size = os.path.getsize(file_path)
                total_size += size
                total_files += 1
                
                # 统计文件类型
                _, ext = os.path.splitext(file)
                ext = ext.lower() if ext else '无扩展名'
                file_types[ext] = file_types.get(ext, 0) + 1
                
            except OSError:
                continue
    
    # 输出结果
    print(f"目录: {directory}")
    print(f"总文件数: {total_files}")
    print(f"总大小: {total_size / (1024*1024):.2f} MB")
    print("\n文件类型分布:")
    for ext, count in sorted(file_types.items(), key=lambda x: x[1], reverse=True):
        print(f"  {ext}: {count} 个文件")

# 使用示例
analyze_directory('/path/to/analyze')

十、总结

os 模块是 Python 中处理文件和目录操作的核心库,提供了:

  • 路径操作:路径拼接、分割、规范化
  • 文件检测:存在性检查、类型判断、属性获取
  • 目录管理:创建、删除、遍历目录
  • 环境变量:获取和设置环境变量
  • 系统信息:获取操作系统相关信息
  • 进程管理:执行命令、获取进程信息

掌握 os 模块的使用对于进行文件操作、系统编程和自动化脚本编写至关重要。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐