这个问题是由于python 2.x cPickle和python 3.x pickle之间的不兼容造成的。
(x, y) = pickle.load(ofname, encoding='latin1)
下面是两个成功的不同应用,序列化和反序列化数据:
- 以下类属于定义二进制数据格式的类:
# 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')
- 以下独立应用程序将数据写入二进制文件:
# 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')
- 以下独立应用程序从二进制文件中读取数据:
# 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