繁体   English   中英

需要一个类似字节的对象,在pickle python 3.6中不需要'str'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM