Python 中pickle出现 ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128) 解决方法

一、问题

博主在读取pkl文件时出现以下错误:

ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

unicode 最大长度为128,利用Python在写入pkl文件时,unicode 则会被作为“中间编码”。因此将读取进来的ascii编码字符串如果超过128则会报错


二、代码

pickle.load()第二个参数加上encoding=‘bytes’,读取的pkl文件中含有的字符串需要加上.encode('utf-8')

import sys
if sys.version_info[0] == 2:
    import cPickle as pickle
else:
    import pickle

def load_pickle(path, verbose=True):
    """Check and load pickle object.
    According to this post: https://stackoverflow.com/a/41733927, cPickle and
    disabling garbage collector helps with loading speed."""
    assert osp.exists(path), "File not exists: {}".format(path)
    # gc.disable()
    with open(path, 'rb') as f:
        # check the python version
        if sys.version_info.major == 3:
            ret = pickle.load(f, encoding='bytes')
        elif sys.version_info.major == 2:
            ret = pickle.load(f)
    # gc.enable()
    if verbose:
        print('Loaded pickle file {}'.format(path))
    return ret

load_path = '你的pkl文件路径'
pkl = load_pickle(load_path)

key_byte = '你的key'.encode('utf-8')
item = pkl[key_byte]
发布了129 篇原创文章 · 获赞 1105 · 访问量 169万+

猜你喜欢

转载自blog.csdn.net/qq_36556893/article/details/96323642