无法加载酸洗对象

我遇到的问题是当我试图加载 Pickled (腌制的)对象时。我试过同时使用 pickle.loadspickle.load,结果如下:

返回文章页面

TypeError: ‘ str’不支持缓冲区接口

返回文章页面

文件必须具有“ 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}
82896 次浏览

You need to either the file first (as binary bytes) and use pickle.loads(), or pass an open file object to the pickle.load() command. The latter is preferable:

with open('out/cache/' +hashed_url, 'rb') as pickle_file:
content = pickle.load(pickle_file)

两种方法都不支持从文件名加载 pickle。

如果您碰巧正在将 python2移植到3并遇到此错误,python2和3处理的字节不同,因此需要使用“ b”选项打开文件句柄。例如,在 python2open(file, 'r') as f: my_list = pickle.load(f)中可以工作,但是在 python3中不可以。相反,您必须使用 open(file, 'rb') as f: my_list = pickle.load(f)打开