What causes the error "_pickle.UnpicklingError: invalid load key, ' '."?
What causes the error "_pickle.UnpicklingError: invalid load key, ' '."?
我正在尝试将 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, ''.
我不完全确定你试图通过寻找特定偏移量并尝试手动加载单个值来实现什么,pickle
模块的典型用法是:
# save data to a file
with open('myfile.pickle','wb') as fout:
pickle.dump([1,2,3],fout)
# read data from a file
with open('myfile.pickle') as fin:
print pickle.load(fin)
# output
>> [1, 2, 3]
如果您转储了一个列表,您将加载一个列表,无需单独加载每个项目。
你是说在查找 -5000 偏移量之前出现错误,可能是你尝试读取的文件已损坏。
如果您可以访问原始数据,我建议您尝试将其保存到一个新文件中并按照示例中的方式读取。
pickling 是递归的,而不是顺序的。因此,为了 pickle 一个列表,pickle
将开始 pickle 包含的列表,然后 pickle 第一个元素……深入到第一个元素并 pickle 依赖项和子元素,直到第一个元素被序列化。然后移动到列表的下一个元素,依此类推,直到它最终完成列表并完成对封闭列表的序列化。简而言之,除了某些特殊情况外,很难将递归 pickle 视为顺序的。如果您想以特殊方式 load
,最好在 dump
上使用更智能的模式。
最常见的泡菜,它用一个 dump
将所有东西泡菜到一个文件中——但是你必须用一个 load
一次 load
所有东西。但是,如果您打开一个文件句柄并执行多个 dump
调用(例如,一个用于列表的每个元素,或一个选定元素的元组),那么您的 load
将反映...您打开文件处理并执行多个 load
调用,直到您拥有所有列表元素并可以重建列表。然而,选择性地 load
仅某些列表元素仍然不容易。为此,您可能必须使用像 klepto
这样的包将列表元素存储为 dict
(以元素或块的索引作为键),它可以分解腌制的dict
透明地分成多个文件,并可以轻松加载特定元素。
Saving and loading multiple objects in pickle file?
这可能与您的具体问题无关,但我在使用 gzip
.
创建 pickle 存档时遇到了类似的问题
例如,如果压缩泡菜存档是这样制作的,
import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
pickle.dump([1,2,3], ofp)
尝试打开它会引发错误
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, ''.
但是,如果 pickle 文件是使用 gzip
打开的,一切都是和谐的
with gzip.open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
[1, 2, 3]
如果您通过磁盘或其他方式传输这些文件,它们很可能没有正确保存。
我在将 *.p 文件上传到 Google Drive 时遇到了类似的错误,但上下文不同。我稍后尝试在 Google Colab 会话中使用它,但收到此错误:
1 with open("/tmp/train.p", mode='rb') as training_data:
----> 2 train = pickle.load(training_data)
UnpicklingError: invalid load key, '<'.
我通过压缩文件解决了这个问题,上传它然后在会话中解压缩。
看起来 pickle 文件在您 upload/download 时没有正确保存,所以它被损坏了。
我通过以下方式解决了我的问题:
- 删除克隆的项目
- 安装git lfs:
sudo apt-get install git-lfs
- 为您的用户帐户设置 git lfs:
git lfs install
- 再次克隆项目。
我在加载 pickled sklearn 模型时收到了类似的错误。问题是 pickle 是通过 sklearn.externals.joblib 创建的,我试图通过标准 pickle 库加载它。使用 joblib 解决了我的问题。
我刚刚遇到了由错误的 pickle 文件(未完全复制)引发的问题。
我的解决方案:检查泡菜文件状态(损坏与否)。
关闭打开的文件
filepath = 'model_v1.pkl' with open(filepath, 'rb') as f: p = cPickle.Unpickler(f) model = p.load() f.close()
如果第一步不行;重启会话
我正在尝试将 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, ''.
我不完全确定你试图通过寻找特定偏移量并尝试手动加载单个值来实现什么,pickle
模块的典型用法是:
# save data to a file
with open('myfile.pickle','wb') as fout:
pickle.dump([1,2,3],fout)
# read data from a file
with open('myfile.pickle') as fin:
print pickle.load(fin)
# output
>> [1, 2, 3]
如果您转储了一个列表,您将加载一个列表,无需单独加载每个项目。
你是说在查找 -5000 偏移量之前出现错误,可能是你尝试读取的文件已损坏。
如果您可以访问原始数据,我建议您尝试将其保存到一个新文件中并按照示例中的方式读取。
pickling 是递归的,而不是顺序的。因此,为了 pickle 一个列表,pickle
将开始 pickle 包含的列表,然后 pickle 第一个元素……深入到第一个元素并 pickle 依赖项和子元素,直到第一个元素被序列化。然后移动到列表的下一个元素,依此类推,直到它最终完成列表并完成对封闭列表的序列化。简而言之,除了某些特殊情况外,很难将递归 pickle 视为顺序的。如果您想以特殊方式 load
,最好在 dump
上使用更智能的模式。
最常见的泡菜,它用一个 dump
将所有东西泡菜到一个文件中——但是你必须用一个 load
一次 load
所有东西。但是,如果您打开一个文件句柄并执行多个 dump
调用(例如,一个用于列表的每个元素,或一个选定元素的元组),那么您的 load
将反映...您打开文件处理并执行多个 load
调用,直到您拥有所有列表元素并可以重建列表。然而,选择性地 load
仅某些列表元素仍然不容易。为此,您可能必须使用像 klepto
这样的包将列表元素存储为 dict
(以元素或块的索引作为键),它可以分解腌制的dict
透明地分成多个文件,并可以轻松加载特定元素。
Saving and loading multiple objects in pickle file?
这可能与您的具体问题无关,但我在使用 gzip
.
例如,如果压缩泡菜存档是这样制作的,
import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
pickle.dump([1,2,3], ofp)
尝试打开它会引发错误
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, ''.
但是,如果 pickle 文件是使用 gzip
打开的,一切都是和谐的
with gzip.open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
[1, 2, 3]
如果您通过磁盘或其他方式传输这些文件,它们很可能没有正确保存。
我在将 *.p 文件上传到 Google Drive 时遇到了类似的错误,但上下文不同。我稍后尝试在 Google Colab 会话中使用它,但收到此错误:
1 with open("/tmp/train.p", mode='rb') as training_data:
----> 2 train = pickle.load(training_data)
UnpicklingError: invalid load key, '<'.
我通过压缩文件解决了这个问题,上传它然后在会话中解压缩。 看起来 pickle 文件在您 upload/download 时没有正确保存,所以它被损坏了。
我通过以下方式解决了我的问题:
- 删除克隆的项目
- 安装git lfs:
sudo apt-get install git-lfs
- 为您的用户帐户设置 git lfs:
git lfs install
- 再次克隆项目。
我在加载 pickled sklearn 模型时收到了类似的错误。问题是 pickle 是通过 sklearn.externals.joblib 创建的,我试图通过标准 pickle 库加载它。使用 joblib 解决了我的问题。
我刚刚遇到了由错误的 pickle 文件(未完全复制)引发的问题。
我的解决方案:检查泡菜文件状态(损坏与否)。
关闭打开的文件
filepath = 'model_v1.pkl' with open(filepath, 'rb') as f: p = cPickle.Unpickler(f) model = p.load() f.close()
如果第一步不行;重启会话