python学习笔记 day20 序列化模块(二)

pickle

可以将任何数据类型转为字符串;但是pickle之后的结果也只有python可以看懂,而且反序列化依靠python代码;

pickle 和 json 很像 都是有dumps loads dump 和 load 四个方法;

但是 pickle 序列化之后的结果是一串二进制(bytes类型)所以pickle 在使用 dump 和 load 进行和文件相关的操作时 需要以二进制的方式打开文件,加上b;

1. pickle.dumps()---将任何数据类型进行序列化(pickle序列化的结果是bytes类型)

    pickle.loads()---反序列化,转回原来的数据类型;

import pickle
dict={'a':1,'b':2,'c':3}
print(dict,type(dict))
str_dic=pickle.dumps(dict)  # 使用pickle.dumps()将字典序列化
print(str_dic,type(str_dic))
dic_2=pickle.loads(str_dic)
print(dic_2,type(dic_2))

运行结果:

2. pickle.dump() -----文件操作有关,注意此时文件必须以二进制方式打开,序列化;

    pickle.load()--- 反序列化,文件必须以二进制方式打开;

    pickle.dump()和 pickle.load() 可以对多个数据类型进行写入文件操作,然后一个一个读出来,也就是支持多次dump 和 多次load (json.dump() 和 json.load()是不直接支持这种操作的)

import pickle
dic={'a':1,'b':2,'c':3}
f=open('info','wb')  # pickle.dump()在对数据类型进行序列化时,文件比如以二进制方式打开,但是encoding=utf-8就不需要了,因为本身bytes类型就是utf-8
pickle.dump(dic,f)   # pickle.dump()是没有返回值的,但是pickle.dumps() pickle.loads() pickle.load()都有返回值
f.close()
f=open('info','rb')  # pickle.load()在进行反序列化时,文件也必须是二进制方式打开;
dic_2=pickle.load(f)
print(dic_2,type(dic_2))
f.close()

运行结果:

然而此时dump进文件的内容是看不懂的~并且会生成三个文件:

再来看pickle.dump()  pickle.load() 多次dump 和 多次load 的情况(json.dump() 和 json.load()是不支持的)

import pickle
import time
struct_time1=time.localtime(1600000000)  # 这次使用的数据类型是结构化元组(struct_time数据类型)
struct_time2=time.localtime()
f=open('info','wb')
pickle.dump(struct_time1,f)  # 对struct_time这种数据类型进行多次dump
pickle.dump(struct_time2,f)
f.close()

f=open('info','rb')
struct_time1=pickle.load(f)  # 对刚才序列化之后的结果多次load
struct_time2=pickle.load(f)
print(struct_time1,type(struct_time1))
print(struct_time2)
print(struct_time1.tm_year)
print(struct_time2.tm_year)

运行结果:

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9650834.html