【问题标题】:How to use append with pickle in python?如何在 python 中使用 append 和 pickle?
【发布时间】:2012-10-06 17:17:53
【问题描述】:

我需要附加到一个泡菜文件(因为我一次没有完整的字典)。所以为了做同样的事情,我编写了以下代码:

 import pickle
 p={}
 p[1]=2
 q={}
 q['a']=p
 p={}
 p[2]=0
 pickle.dump(q, open("save12.p","ab"))
 f={}
 f['b']=p
 pickle.dump(f,open("save12.p","ab"))

但是,当我加载泡菜文件时,我没有找到字典 f 的值??????

有人可以建议我应该如何添加到泡菜文件中???

当我在 windows 上工作时,像“dbm”这样的数据库也不能满足我的需要

【问题讨论】:

  • 是什么让您认为两个附加的泡菜流会以某种方式神奇地被接受为一个新对象?如果您的数据太大而无法放入内存,请使用数据库(您有很多选择,dbm 并不是唯一的选择)。
  • ZODB 在 Windows 上运行良好;它也储存泡菜。

标签: python python-2.7


【解决方案1】:

Pickle 流是完全自包含的,因此 unpickle 一次将 unpickle 一个对象。

因此,要对多个流进行 unpickle,您应该反复 unpickle 文件,直到出现 EOFError:

>>> f=open('a.p', 'wb')
>>> pickle.dump({1:2}, f)
>>> pickle.dump({3:4}, f)
>>> f.close()
>>> 
>>> f=open('a.p', 'rb')
>>> pickle.load(f)
{1: 2}
>>> pickle.load(f)
{3: 4}
>>> pickle.load(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
EOFError

所以你的 unpickle 代码可能看起来像

import pickle
objs = []
while 1:
    try:
        objs.append(pickle.load(f))
    except EOFError:
        break

【讨论】:

    【解决方案2】:
    #To append to a pickle file
    import pickle
    
    p={1:2}
    q={3:4}
    filename="picklefile"
    with open(filename, 'a+') as fp:
        pickle.dump(p,fp)
        pickle.dump(q,fp)
    
    
    #To load from pickle file
    data = []
    with open(filename, 'rb') as fr:
        try:
            while True:
                data.append(pickle.load(fr))
        except EOFError:
            pass
    

    【讨论】:

    • 除了try没有别的办法吗?
    • 这段代码完美无缺,但只是一个补充。如果抛出 请使用 open(filename, 'a+') 修改 open(文件名,'ab+')
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多