[英]a bytes-like object is required, no 'str' with pickle python 3.6
我正在努力在macOS上使用python3.6修复此代码,尽管该代码曾经在python 2.x上运行。请始终使此错误成为类似字节的对象,没有'str'并且无法使其正常工作通过'r'->'rb'“ w”->“ wb”或pickle.load(f)更改代码pickle.loads(f)
对于函数write()也会得到错误“ write()参数必须为str,而不是字节”
这是完整代码的链接https://pastebin.com/embed_js/7tsdP9J6
#This is for saving params
if iter % SAVE_PARAMS_EVERY == 0 and useSaved:
save_params(iter, x)
def save_params(iter, params):
with open("saved_params_%d.npy" % iter, "wb") as f:
pickle.dump(params, f)
pickle.dump(random.getstate(), f)
def load_saved_params():
"""
A helper function that loads previously saved parameters and resets
iteration start.
"""
st = 0
for f in glob.glob("saved_params_*.npy"):
iter = int(op.splitext(op.basename(f))[0].split("_")[2])
if (iter > st):
st = iter
if st > 0:
with open("saved_params_%d.npy" % st, "rb") as f:
params = pickle.loads(f)
state = pickle.loads(f.read())
return st, params, state
else:
return st, None, None
根据Python的官方文档:
pickle.load()
期望将打开的文件对象作为第一个位置参数传递,而pickle.loads()
期望使用bytes
对象。 还要注意encoding="ASCII"
参数。 说到encoding
,文档指出您可以将其设置为bytes
以使pickle
可以将8位字符串实例作为bytes
对象读取。
我以前从未使用过pickle
,因此无法给出具体答案,但也许尝试像这样重写您的代码段:
with open("saved_params_{}.npy".format(st), "rb") as f:
file_contents = f.read()
# use pickle.load(file_contents) from now on
实际上,当您执行f.read()
,将读取整个文件内容,并且文件光标将指向文件的末尾。 下次使用read()
时,将没有内容可供您读取,因为第一个调用已经“消耗”了整个文件。 也许是问题所在,因为在第二次调用pickle.read()
时传递了空文件内容?
希望它能有所帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.