【问题标题】:How to get number of objects in a pickle?如何获取泡菜中的对象数量?
【发布时间】:2013-05-06 16:34:45
【问题描述】:

有没有一种简单的方法来获取腌制文件中的对象数量 - 比编写打开文件的函数更短,不断调用 pickle.load 方法并将 num_of_objs 更新 1 直到它捕获 EOFError 并返回值?

【问题讨论】:

标签: python python-3.x pickle


【解决方案1】:

不,没有。 pickle 格式不存储该信息。

如果需要那种类型的元数据,需要在写的时候自己添加到文件中:

pickle.dump(len(objects), fileobj)
for ob in objects:
    pickle.dump(ob, fileobj)

现在第一条记录告诉你还有多少要遵循。

【讨论】:

  • 如果您事先知道,为什么不直接转储整个对象列表呢?喜欢pickle.dump(objects, fileobj)
  • @Matt:这将要求您再次一步加载该列表。如果您想逐个迭代对象以节省内存怎么办?如果你pickle objects,那么你只能加载整个列表。
  • 嗯,在我看来,如果这是一个问题(你的列表太大,可能会导致内存问题),你不会/不应该使用泡菜。但足够公平
  • @Matt:你为什么使用泡菜? ZODB project 围绕存储泡菜构建了一个符合 ACID 的跨ACID 数据库,让您可以存储大量对象。仅仅因为这里的写入端对大列表有内存并不意味着读取端一定有。
【解决方案2】:

没有直接的方法可以找到泡菜的长度,但是如果您害怕运行无限循环,可以尝试以下方法,

company_id_processed=[]
with open("responses_pickle.pickle", "rb") as f:
while True:   
    try:
        current_id=pickle.load(f)['name']
        company_id_processed.append(current_id)
    except EOFError:
        print 'Pickle ends'
        break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2017-11-24
    • 2013-07-25
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多