当我使用泡菜时,它工作正常,我可以卸载任何负载.
问题是如果我关闭程序并尝试再次转储,它会用新转储替换旧文件数据.这是我的代码:
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
(否则)而不是字典.
当您以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
(否则)而不是字典.