【问题标题】:Decoding error when using pickle in python [duplicate]在python中使用pickle时解码错误[重复]
【发布时间】:2021-12-15 18:41:57
【问题描述】:

当我运行代码时:

import pickle
ofname = open(r"ch05\dataset_small.pkl", 'rb')
(x, y) = pickle.load(ofname)

我在运行上面的代码时遇到的错误是:

'ascii' codec can't decode byte 0xac in position 6: ordinal not in range(128)

如何解决这个错误?

【问题讨论】:

    标签: python encoding pickle


    【解决方案1】:

    这个问题是由于python 2.x cPicklepython 3.x pickle之间的不兼容造成的。

    (x, y) = pickle.load(ofname, encoding='latin1)
    

    下面是两个成功的不同应用,序列化和反序列化数据:

    1. 以下类属于定义二进制数据格式的类:
    # user.py
    class User:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        
        def show(self):
            print(f'Name: {self.name}\nAge: {self.age}\n')
    
    1. 以下独立应用程序将数据写入二进制文件:
    # picker.py
    import pickle, user
    
    with open('user.dat','wb') as f:
        n = int(input("Enter number of users: "))
        for i in range(n):
            name = input("Enter Name: ")
            age = input("Enter Age: ")
    
            ob = user.User(name,age)
            pickle.dump(ob, f)
            
    print('Done')
    
    1. 以下独立应用程序从二进制文件中读取数据:
    # unpicker.py
    import pickle, user
    
    with open('user.dat','rb') as f:
        while True:
            try:
                # Note that the encoding argument is used in the picker.load() method.
                obj = pickle.load(f, encoding='latin1')
                obj.show()
            except EOFError:
                print('Done')
                break
    

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多