【问题标题】:Value Error when unpickling a file解压文件时出现值错误
【发布时间】:2015-04-10 10:40:11
【问题描述】:

我收到了一个包含两个腌制对象的文件 - 它是作为 .pk 文件发送给我的。有人告诉我它有两个对象,但是,我尝试解开这些文件是不成功的。

第一个腌制对象包含数字对及其罗马数字的字典,第二个包含罗马数字及其数字的字典对。如何分别解开这两个字典?

这是我下面的内容,以及我收到的错误消息:

import pickle
x,y=pickle.load(open("C://Users//Documents//roman.pk", "rb"))
print(x,y)

错误信息:

ValueError: too many values to unpack (expected 2)

【问题讨论】:

  • 如果你只是pickle.load 一个对象会发生什么,然后看看它包含什么?字典之一?还有什么?你也可以尝试在同一个文件上调用pickle.load 两次(即open 一次,然后load 两次)。见stackoverflow.com/q/20716812/3001761
  • 如果我只用一个变量运行它,那么它会给我一个字典。如果我尝试从中加载两次,它只会给我第一本字典两次。
  • 您是否两次都使用load(open(...))?如果是这样,这会将指针重置为文件的开头。您需要打开一次(最好使用with 上下文管理器 - 请参阅stackoverflow.com/a/3287367/3001761)。
  • 抱歉,误解了您的回答。按照您的建议切换格式,它正在工作!非常感谢

标签: python file pickle


【解决方案1】:

pickle.load 只会加载它在文件中找到的第一个腌制对象。在您的情况下,这是一个包含两个以上键的字典,因此 x, y = pickle.load(...) 失败,因为它试图将 字典的键 解压缩为标识符 x 和 y。

相反,您应该 open 文件一次,然后 load 两次:

with open("...roman.pk") as file_:
    first_dict = pickle.load(file_)  # file pointer is now at end of first object
    second_dict = pickle.load(file_)  # read in second object

或者,鼓励向您提供文件的人将两个字典放入一个对象中,例如一个元组 (first_dict, second_dict) 和 pickle 那个单个对象;这比依赖于确切知道文件中有多少腌制对象要容易得多。

【讨论】:

    【解决方案2】:

    pickle.load 应该将数据结构加载到一个参数中。 如果您在 roman.pk 中有 2 部字典,则取决于 2 部字典的分组方式

    例如(dict1,dict2)

    在这种情况下: 您可能想尝试: (x,y)= pickle.load(open("C://Users//Documents//roman.pk", "rb")) 打印长度(x) 打印长度(y) 检查它是否正确加载

    【讨论】:

    • (x, y) = ... 与 x, y = ... 完全相同,并且会因为同样的原因而失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多