Pickle转储替换当前文件数据

 花长好月常圆人长久 发布于 2023-02-10 00:19

当我使用泡菜时,它工作正常,我可以卸载任何负载.

问题是如果我关闭程序并尝试再次转储,它会用新转储替换旧文件数据.这是我的代码:

import pickle
import os
import time


dictionary = dict()


def read():
    with open('test.txt', 'rb') as f:
        a = pickle.load(f)
    print(a)
    time.sleep(2)


def dump():
    chs = raw_input('name and number')
    n = chs.split()
    dictionary[n[0]] = n[1]
    with open('test.txt', 'wb') as f:
        pickle.dump(dictionary, f)


Inpt = raw_input('Option : ')
if Inpt == 'read':
    read()
else:
    dump()

abarnert.. 8

当您以w模式(或wb)打开文件时,它会告诉它写一个全新的文件,删除已存在的文件.

正如文档所说:

最常用的模式值是'r'用于读取,'w'用于写入(截断文件,如果它已经存在),'a'用于追加...

换句话说,你想要使用'ab',而不是'wb'.


但是,当您将新转储附加到同一文件时,最终会得到一个由多个单独值组成的文件.如果你只拨打load一次,它就会加载第一个.如果要加载所有这些,则需要编写执行此操作的代码.例如,你可以load循环直到EOFError.


真的,它看起来就像你正在试图做的是不追加到泡菜文件,而是修改现有的腌制字典.

您可以使用将所有转储加载并合并在一起的函数来执行此操作,如下所示:

def Load():
    d = {}
    with open('test.txt', 'rb') as f:
        while True:
            try:
                a = pickle.load(f)
            except EOFError:
                break
            else:
                d.update(a)
    # do stuff with d

但是,当您运行程序的次数越来越多时,这将越来越慢,因为您会堆积越来越多的相同值的副本.要做到这一点正确的,你需要加载的旧字典,修改,然后倾倒在修改后的版本.为此,你想要 w模式.

但是,一个更好的方法来保持字典,至少如果键是字符串,是使用dbm(如果值也是字符串)或shelve(否则)而不是字典.

1 个回答
  • 当您以w模式(或wb)打开文件时,它会告诉它写一个全新的文件,删除已存在的文件.

    正如文档所说:

    最常用的模式值是'r'用于读取,'w'用于写入(截断文件,如果它已经存在),'a'用于追加...

    换句话说,你想要使用'ab',而不是'wb'.


    但是,当您将新转储附加到同一文件时,最终会得到一个由多个单独值组成的文件.如果你只拨打load一次,它就会加载第一个.如果要加载所有这些,则需要编写执行此操作的代码.例如,你可以load循环直到EOFError.


    真的,它看起来就像你正在试图做的是不追加到泡菜文件,而是修改现有的腌制字典.

    您可以使用将所有转储加载并合并在一起的函数来执行此操作,如下所示:

    def Load():
        d = {}
        with open('test.txt', 'rb') as f:
            while True:
                try:
                    a = pickle.load(f)
                except EOFError:
                    break
                else:
                    d.update(a)
        # do stuff with d
    

    但是,当您运行程序的次数越来越多时,这将越来越慢,因为您会堆积越来越多的相同值的副本.要做到这一点正确的,你需要加载的旧字典,修改,然后倾倒在修改后的版本.为此,你想要 w模式.

    但是,一个更好的方法来保持字典,至少如果键是字符串,是使用dbm(如果值也是字符串)或shelve(否则)而不是字典.

    2023-02-10 00:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有