无法加载腌制对象
Posted
技术标签:
【中文标题】无法加载腌制对象【英文标题】:Cannot load pickled object 【发布时间】:2013-08-18 04:28:08 【问题描述】:我遇到的问题是当我尝试加载 pickled 对象时。我尝试过同时使用pickle.loads
和pickle.load
以下是结果:
pickle.loads
:
TypeError: 'str' 不支持缓冲区接口
pickle.load
:
TypeError: file must have 'read' 和 'readline' 属性
谁能告诉我在这个过程中我做错了什么?
elif str(parser) == "SwissWithdrawn_Parser":
# swissprot name changes
print("Gathering SwissProt update info...")
cache_hits = 0
cache_misses = 0
files = set()
for f in os.listdir("out/cache/"):
if os.path.isfile("out/cache/" + f):
files.add(f)
for name in sp_lost_names:
cached = False
url = (
"http://www.uniprot.org/uniprot/?query=mnemonic%3a"
+ name
+ "+active%3ayes&format=tab&columns=entry%20name"
)
hashed_url = str(hash(url))
################### For Testing Only - use cache ##################
if hashed_url in files:
cached = True
cache_hits += 1
content = pickle.loads("out/cache/" + hashed_url) # <-- problematic line
else:
cache_misses += 1
content = urllib.request.urlopen(url)
# get the contents returned from the HTTPResponse object
content_list = [x.decode().strip() for x in content.readlines()]
if not cached:
with open("out/cache/" + hashed_url, "wb") as fp:
pickle.dump(content_list, fp)
####################################################################
# no replacement
if len(content_list) is 0:
change_log["swiss-names"] = name: "withdrawn"
# get the new name
else:
new_name = content_list[1]
change_log["swiss-names"] = name: new_name
【问题讨论】:
【参考方案1】:您需要先读取文件(作为二进制文件bytes
)并使用pickle.loads()
,或者将打开的文件对象传递给pickle.load()
命令。后者更可取:
with open('out/cache/' +hashed_url, 'rb') as pickle_file:
content = pickle.load(pickle_file)
这两种方法都不支持从文件名加载泡菜。
【讨论】:
【参考方案2】:如果您碰巧将 python2 移植到 3 并遇到此错误,python2 和 3 的句柄字节不同,导致需要使用“b”选项打开文件句柄。例如在 python2 open(file, 'r') as f: my_list = pickle.load(f)
中有效,但在 python3 中无效。相反,您必须使用open(file, 'rb') as f: my_list = pickle.load(f)
打开
【讨论】:
我得到了 _pickle.UnpicklingError:遇到了加载持久 id 指令,但没有指定持久加载函数。并且pickle文件像data.pickle一样存在以上是关于无法加载腌制对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 joblib 加载腌制 scikit-learn 模型时出现 KeyError
Python中的Mongodb聚合:无法腌制'SSLContext'对象
无法使用 PySpark 腌制 listreverseiterator 对象
PySpark / Glue:PicklingError:无法序列化对象:TypeError:无法腌制thread.lock对象