我正在尝试将 5000 个数据元素存储在一个数组中。这 5000 个元素存储在现有文件中(因此它不是空的)。
但我收到一个错误。
在:
def array():
name = 'puntos.df4'
m = open(name, 'rb')
v = []*5000
m.seek(-5000, io.SEEK_END)
fp = m.tell()
sz = os.path.getsize(name)
while fp < sz:
pt = pickle.load(m)
v.append(pt)
m.close()
return v
出去:
line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
原文由 Xcecution 发布,翻译遵循 CC BY-SA 4.0 许可协议
酸洗是递归的,而不是顺序的。因此,要 pickle 一个列表,
pickle
将开始 pickle 包含列表,然后 pickle 第一个元素……深入到第一个元素并 pickle 依赖项和子元素,直到第一个元素被序列化。然后移动到列表的下一个元素,依此类推,直到它最终完成列表并完成对封闭列表的序列化。简而言之,除了某些特殊情况外,很难将递归 pickle 视为顺序的。最好在你的dump
上使用更智能的模式,如果你想load
以一种特殊的方式。最常见的 pickle,它用一个
dump
将所有东西腌制到一个文件中 -- 但是你必须load
一次用一个load
但是,如果您打开一个文件句柄并执行多个dump
调用(例如,一个用于列表的每个元素,或一个选定元素的元组),那么您的load
将反映…您打开文件句柄并执行多个load
调用,直到您拥有所有列表元素并可以重建列表。但是,选择性地load
仅某些列表元素仍然不容易。为此,您可能必须使用类似klepto
的包将列表元素存储为dict
(以元素或块的索引作为键),它可以将dict
透明地分解成几个文件,并可以轻松加载特定元素。在 pickle 文件中保存和加载多个对象?