我正在尝试在阵列上存储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
Run Code Online (Sandbox Code Playgroud)
OUT:
line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
Run Code Online (Sandbox Code Playgroud)
Mik*_*rns 10
酸洗是递归的,而不是顺序的.因此,为了挑选一个列表,pickle将开始挑选包含列表,然后挑选第一个元素...潜入第一个元素并腌制依赖项和子元素,直到第一个元素被序列化.然后转到列表的下一个元素,依此类推,直到它最终完成列表并完成序列化封闭列表.简而言之,除了一些特殊情况外,很难将递归的pickle视为顺序.dump如果您想以load特殊方式使用,最好使用更智能的模式.
最常见的泡菜,它用一个dump文件来腌制所有东西- 但是你必须用一个文件load一次性完成所有事情load.但是,如果你打开一个文件句柄并进行多次dump调用(例如,列表的每个元素一个,或者所选元素的元组),那么你load将镜像...你打开文件句柄并进行多次load调用直到你拥有所有的列出元素并可以重建列表.load然而,选择性地仅选择某些列表元素仍然不容易.要做到这一点,您可能必须将列表元素存储为dict(使用元素或块的索引作为键),使用透明的文件包到几个文件中,并且可以轻松加载特定元素.klepto,这可以分解一个pickledict
小智 10
如果您通过磁盘或其他方式传输这些文件,很可能它们没有正确保存。
这可能与您的特定问题无关,但是当使用创建咸菜档案时,我遇到了类似的问题gzip。
例如,如果像这样制作一个压缩的泡菜档案,
import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
pickle.dump([1,2,3], ofp)
Run Code Online (Sandbox Code Playgroud)
尝试打开它会引发错误
with open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
_pickle.UnpicklingError: invalid load key, ''.
Run Code Online (Sandbox Code Playgroud)
但是,如果打开泡菜文件,gzip所有文件都会和谐
with gzip.open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)