前言

PythonOS文件操作相关方法用途及功能。该模块可跨平台与操作系统交互,支持文件、目录操作等。可以进行工作目录的获取与切换、目录内容的列出、目录的创建与删除、文件的删除与重命名,以及环境变量获取和系统命令执行的相关操作

1. 导入 OS 模块

import os

2. 文件操作

2.1 文件重命名

# 重命名文件
os.rename('old_name.txt', 'new_name.txt')

# 安全的重命名(如果目标存在则覆盖)
os.replace('old_name.txt', 'new_name.txt')

注意事项:

  1. 如果目标文件已存在,rename() 可能失败
  2. replace() 在目标存在时会覆盖,更安全
  3. 跨文件系统重命名可能失败

2.2 删除文件

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

# 如果文件不存在会抛出异常,建议先检查
if os.path.exists('file.txt'):
    os.remove('file.txt')

2.3 获取文件信息

    import time

    # 获取文件状态
    file_stat = os.stat('file.txt')
    print(f"文件大小: {file_stat.st_size} bytes")
    print(f"最后修改时间: {time.ctime(file_stat.st_mtime)}")
    print(f"最后访问时间: {time.ctime(file_stat.st_atime)}")

3. 目录操作

3.1 创建目录

    # 创建单个目录
    os.mkdir('new_directory')

    # 递归创建多级目录
    os.makedirs('path/to/nested/directory', exist_ok=True)

    # 创建目录并设置权限(Unix系统)
    os.mkdir('secure_dir', mode=0o755)

注意事项:

  1. mkdir() 只能创建单级目录
  2. makedirs() 可以创建多级目录
  3. 使用 exist_ok=True 避免目录已存在时的异常

3.2 删除目录

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

    # 递归删除目录树(危险操作)
    import shutil
    shutil.rmtree('directory_to_remove')

    # 安全删除空目录
    if os.path.exists('dir') and os.path.isdir('dir'):
        try:
            os.rmdir('dir')
        except OSError as e:
            print(f"目录非空: {e}")

3.3 遍历目录

    # 列出目录内容
    items = os.listdir('.')
    print("当前目录内容:", items)

    # 使用 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}")

    # 递归遍历目录树
    for root, dirs, files in os.walk('.'):
        print(f"当前目录: {root}")
        print(f"子目录: {dirs}")
        print(f"文件: {files}")
        print("-" * 40)

4. 路径操作

4.1 路径拼接和分解

    # 安全的路径拼接
    full_path = os.path.join('folder', 'subfolder', 'file.txt')
    print(f"完整路径: {full_path}")

    # 路径分解
    directory, filename = os.path.split('/path/to/file.txt')
    print(f"目录: {directory}, 文件名: {filename}")

    name, extension = os.path.splitext('document.pdf')
    print(f"文件名: {name}, 扩展名: {extension}")

4.2 路径检查

    path = '/path/to/some/file.txt'

    print(f"是否存在: {os.path.exists(path)}")
    print(f"是文件: {os.path.isfile(path)}")
    print(f"是目录: {os.path.isdir(path)}")
    print(f"是链接: {os.path.islink(path)}")
    print(f"绝对路径: {os.path.abspath(path)}")

5. 环境和工作目录

5.1 工作目录操作

    # 获取当前工作目录
    current_dir = os.getcwd()
    print(f"当前目录: {current_dir}")

    # 改变工作目录
    os.chdir('/new/directory/path')

    # 临时改变工作目录(推荐)
    original_dir = os.getcwd()
    try:
        os.chdir('/temp/path')
        # 执行操作
    finally:
        os.chdir(original_dir)  # 确保恢复原目录

5.2 环境变量

    # 获取环境变量
    home_dir = os.getenv('HOME')
    path_var = os.getenv('PATH', '默认值')  # 提供默认值

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

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

6. 高级文件操作

6.1 文件权限管理

    import stat

    # 设置文件权限
    os.chmod('file.txt', stat.S_IRUSR | stat.S_IWUSR)  # 用户读写

    # 检查文件权限
    file_mode = os.stat('file.txt').st_mode
    if file_mode & stat.S_IRUSR:
        print("用户有读权限")

6.2 创建临时文件

import tempfile

# 创建临时文件(自动删除)
with tempfile.NamedTemporaryFile(mode='w+', delete=True) as temp_file:
    temp_file.write("临时内容")
    temp_file.seek(0)
    print(temp_file.read())

# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:
    print(f"临时目录: {temp_dir}")
    # 在临时目录中工作

7. 综合案例

7.1 文件备份工具

import os
import shutil
from datetime import datetime

def backup_file(source_path, backup_dir):
    """备份文件到指定目录"""
    if not os.path.isfile(source_path):
        print(f"错误: {source_path} 不是文件")
        return False
    
    # 创建备份目录
    os.makedirs(backup_dir, exist_ok=True)
    
    # 生成备份文件名
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = os.path.basename(source_path)
    backup_name = f"{os.path.splitext(filename)[0]}_{timestamp}{os.path.splitext(filename)[1]}"
    backup_path = os.path.join(backup_dir, backup_name)
    
    try:
        shutil.copy2(source_path, backup_path)
        print(f"备份成功: {backup_path}")
        return True
    except Exception as e:
        print(f"备份失败: {e}")
        return False

# 使用示例
backup_file('important_document.txt', './backups')

7.2 目录大小计算

def get_directory_size(directory):
    """计算目录总大小"""
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(directory):
        for filename in filenames:
            filepath = os.path.join(dirpath, filename)
            if os.path.isfile(filepath):
                total_size += os.path.getsize(filepath)
    return total_size

def format_size(size_bytes):
    """格式化文件大小"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if size_bytes < 1024.0:
            return f"{size_bytes:.2f} {unit}"
        size_bytes /= 1024.0
    return f"{size_bytes:.2f} TB"

# 使用示例
directory = '.'
size = get_directory_size(directory)
print(f"目录 {directory} 大小: {format_size(size)}")

7.3 文件查找工具

def find_files(directory, pattern=None, file_type='both'):
    """
    在目录中查找文件
    file_type: 'file', 'dir', 'both'
    """
    matches = []
    
    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:
                    matches.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:
                    matches.append(os.path.join(root, dir_name))
    
    return matches

# 使用示例
python_files = find_files('.', '.py', 'file')
print("找到的Python文件:")
for file in python_files:
    print(f"  {file}")

8. 重要注意事项

8.1 安全性

    # 不安全的路径拼接(可能遭受路径遍历攻击)
    user_input = "../../etc/passwd"
    unsafe_path = os.path.join('/safe/dir', user_input)  # 危险!

    # 安全的路径处理
    def safe_join(base_dir, user_path):
        full_path = os.path.join(base_dir, user_path)
        full_path = os.path.normpath(full_path)
        if not full_path.startswith(os.path.abspath(base_dir)):
            raise ValueError("路径遍历攻击检测!")
        return full_path

8.2 错误处理

import errno

def safe_file_operations():
    try:
        # 文件操作
        with open('file.txt', 'r') as f:
            content = f.read()
            
        # 目录操作
        os.mkdir('new_dir')
        
    except FileNotFoundError:
        print("文件或目录不存在")
    except PermissionError:
        print("权限不足")
    except OSError as e:
        if e.errno == errno.ENOSPC:
            print("磁盘空间不足")
        else:
            print(f"系统错误: {e}")
    except Exception as e:
        print(f"未知错误: {e}")

safe_file_operations()

8.3 跨平台兼容性

    # 使用 os.path 处理路径,不要硬编码分隔符
    bad_path = "folder\\subfolder\\file.txt"  # Windows专用
    good_path = os.path.join("folder", "subfolder", "file.txt")  # 跨平台

    # 检查操作系统
    if os.name == 'nt':  # Windows
        print("运行在Windows系统")
    elif os.name == 'posix':  # Linux/Unix/Mac
        print("运行在Unix-like系统")

Python OS 模块的主要功能,使用时需要注意错误处理、安全性和跨平台兼容性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐