Python文件写入操作详解:覆盖写与追加写

Python文件写入操作详解:覆盖写与追加写

一、前言

文件写入是Python文件操作的重要组成部分。本文将详细介绍使用open()函数进行文件写入的两种主要模式:覆盖写('w’模式)和追加写('a’模式),并深入探讨相关注意事项和最佳实践。最后,我们将结合前一篇文件读取的内容,实现一个综合案例。

二、文件写入基础

1. 基本语法

file = open(filename, mode, encoding)

写入常用模式:

  • 'w':覆盖写(文件存在则清空,不存在则创建)
  • 'a':追加写(文件存在则追加,不存在则创建)
  • 'w+':可读可写(覆盖)
  • 'a+':可读可写(追加)

2. 覆盖写示例

# 覆盖写入(如果文件已存在会被清空)
with open('data.txt', 'w', encoding='utf-8') as f:
    f.write("第一行内容\n")
    f.write("第二行内容\n")
    # writelines用于写入多行(接收字符串列表)
    f.writelines(["第三行内容\n", "第四行内容\n"])

3. 追加写示例

# 追加写入(保留原有内容)
with open('data.txt', 'a', encoding='utf-8') as f:
    f.write("新增内容1\n")
    f.write("新增内容2\n")

三、关键注意事项

1. 文件指针行为

  • 'w'模式打开时:文件指针位于开头(会覆盖原有内容)
  • 'a'模式打开时:文件指针自动位于末尾

2. 缓冲与刷新

  1. 自动刷新

    • 文件关闭时(close())会自动调用flush()
    • 缓冲区满时会自动刷新
  2. 手动刷新

    f.write("重要内容")
    f.flush()  # 立即将内容写入磁盘
    

    适用场景:需要确保重要数据立即持久化时

  3. 禁用缓冲(不推荐常规使用):

    open('data.txt', 'w', buffering=0)
    

3. 资源管理要点

  1. 必须关闭文件

    • 未关闭文件可能导致数据未完全写入
    • 使用with语句可避免忘记关闭
  2. 重复写入问题

    # 错误示例(每次循环都会重新以'w'模式打开文件)
    for i in range(5):
        with open('data.txt', 'w') as f:
            f.write(str(i))
    
    # 正确做法(只打开一次)
    with open('data.txt', 'w') as f:
        for i in range(5):
            f.write(str(i))
    

4. 异常处理

try:
    with open('data.txt', 'w') as f:
        f.write("测试内容")
except IOError as e:
    print(f"文件操作失败: {e}")
except PermissionError:
    print("无写入权限")
except Exception as e:
    print(f"未知错误: {e}")

四、覆盖写 vs 追加写对比

特性 'w’模式 'a’模式
文件存在时 清空原有内容 保留原有内容
文件不存在时 创建新文件 创建新文件
指针位置 文件开头 文件末尾
典型用途 创建新文件/覆盖旧文件 日志记录/追加数据
安全性 高风险(会丢失旧数据) 低风险

五、综合案例:文件过滤处理

结合前一篇的文件读取知识,实现一个文件过滤程序:

# 案例:过滤日志文件中的错误信息
def filter_errors(input_file, output_file):
    """
    从输入文件中提取包含'ERROR'的行,写入输出文件
    
    :param input_file: 输入文件路径
    :param output_file: 输出文件路径
    """
    try:
        with open(input_file, 'r', encoding='utf-8') as fin, \
             open(output_file, 'w', encoding='utf-8') as fout:
            
            # 记录处理行数
            total_lines = 0
            error_lines = 0
            
            for line in fin:
                total_lines += 1
                if 'ERROR' in line.upper():
                    error_lines += 1
                    fout.write(line)
            
            print(f"处理完成。共扫描{total_lines}行,发现{error_lines}条错误记录")
    
    except FileNotFoundError:
        print("错误:输入文件不存在")
    except Exception as e:
        print(f"处理过程中发生错误: {e}")

# 使用示例
filter_errors('system.log', 'errors.log')

案例说明:

  1. 功能

    • 读取原始日志文件
    • 筛选包含"ERROR"的行(不区分大小写)
    • 将错误行写入新文件
  2. 扩展方向

    • 添加更复杂的过滤条件(正则表达式)
    • 对错误信息进行分类统计
    • 添加时间戳标记处理时间
  3. 优化建议

    # 使用生成器处理大文件
    def filter_lines(input_file, condition):
        with open(input_file, 'r') as f:
            for line in f:
                if condition(line):
                    yield line
    
    # 使用方式
    with open('output.txt', 'w') as fout:
        for line in filter_lines('input.txt', lambda x: 'ERROR' in x):
            fout.write(line)
    

六、总结

  1. 模式选择

    • 需要完全重写文件使用'w'
    • 需要保留原有内容使用'a'
  2. 资源管理

    • 优先使用with语句
    • 避免频繁打开关闭同一文件
  3. 数据安全

    • 重要操作后考虑手动flush()
    • 添加适当的异常处理
  4. 性能考量

    • 大批量写入时,考虑一次性写入多个内容
    • 超大文件处理使用生成器或分块处理

通过结合文件读取和写入操作,可以实现各种实用的文件处理程序。在实际开发中,应根据具体需求选择合适的写入模式和操作方法。

你可能感兴趣的:(python学习笔记,python)