Python中如何实现打开pickle文件后先读取再写入?

open rb+ 是可以先读后写,调试程序的时候才发现,不能在结合使用 pickle 的时候先读后写,写的时候会抛出错误.那么如何实现先读后 覆盖写 呢?

一小段测试代码: http://chuantu.biz/t6/311/1526454143x-1404795577.jpg


Python中如何实现打开pickle文件后先读取再写入?

6 回复

写到一个临时文件 确定写入成功之后把临时文件覆盖原文件


直接使用 open() 模式 'rb+''ab+' 就行,但要注意文件指针位置。pickle 读写通常分两步更清晰安全。

核心方案:

  1. 分步读写(推荐):先 'rb' 读取全部数据到变量,再 'wb' 写入修改后的数据。简单可靠,避免指针混乱。
  2. 单文件混合模式:用 'rb+' 打开,但需要手动控制文件指针(seek(0) 回到开头),且新数据长度不能超过原文件,否则会覆盖不全。不推荐新手用。

示例代码(分步读写,最常用):

import pickle

def read_then_write(pickle_file_path, new_data):
    # 1. 读取原数据
    try:
        with open(pickle_file_path, 'rb') as f:
            original_data = pickle.load(f)  # 读取已有内容
    except FileNotFoundError:
        original_data = None  # 文件不存在时初始化

    # 2. 处理数据(示例:如果是列表就追加)
    if original_data is None:
        original_data = [new_data]
    elif isinstance(original_data, list):
        original_data.append(new_data)
    else:
        # 根据你的数据结构调整
        original_data = [original_data, new_data]

    # 3. 写入新数据(覆盖原文件)
    with open(pickle_file_path, 'wb') as f:
        pickle.dump(original_data, f)

# 使用示例
read_then_write('data.pkl', {'new_key': 'new_value'})

关键点:

  • 'rb''wb' 是二进制读写模式,pickle 必须用。
  • 先读后写时,读用 'rb',写用 'wb'(会覆盖文件)。
  • 如果要在原数据基础上修改,一定要先 pickle.load() 拿到对象,修改对象,再 pickle.dump() 写回。

一句话建议:用 'rb' 读、'wb' 写分两步操作最稳。

要这么操作才行啊

如果要这样,那还不如 open 二次 第一次读 第二次写

pickle.dump(fh)是啥意思,缺失参数吧,dump(obj, file, protocol=None)

原来是语法写错了!

回到顶部