python 序列化模块

序列化是将原本列表, 字典等内容转换成字符串的过程.(把变量从内存中变成可存储或传输的过程)

python 提供了两个模块可进行序列化, 分别是 pickle 和 json.

json,用于字符串 和 python 数据类型间进行转换
pickle,用于 python 特有的类型 和 python 的数据类型间进行转换
pickle 模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表…可以把 python 中任意的数据类型序列化)

import pickle
dic = {‘k1’:‘v1’,‘k2’:‘v2’,‘k3’:‘v3’}
str_dic = pickle.dumps(dic)
print(str_dic) #一串二进制内容

dic2 = pickle.loads(str_dic)
print(dic2) #字典

import time
struct_time = time.localtime(1000000000)
print(struct_time)
f = open(‘pickle_file’,‘wb’)
pickle.dump(struct_time,f)
f.close()

f = open(‘pickle_file’,‘rb’)
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)
with open(‘pickle_file’,‘rb’) as f: #可以多次 dump 和多次 load
while True:
try:
ret = pickle.load(f)
print(ret,type(ret))
except EOFError:
break

json 模块也提供了四个功能:dumps、dump、loads、load

import json
dic = {‘k1’:‘v1’,‘k2’:‘v2’,‘k3’:‘v3’}
str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)#<class ‘str’> {“k3”: “v3”, “k1”: “v1”, “k2”: “v2”}
#注意,json 转换完的字符串类型的字典中的字符串是由 "" 表示的

dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用 json 的 loads 功能处理的字符串类型的字典中的字符串必须由 "" 表示
print(type(dic2),dic2)#<class ‘dict’> {‘k1’: ‘v1’, ‘k2’: ‘v2’, ‘k3’: ‘v3’}

list_dic = [1,[‘a’,‘b’,‘c’],3,{‘k1’:‘v1’,‘k2’:‘v2’}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
print(type(str_dic),str_dic)#<class ‘str’> [1, [“a”, “b”, “c”], 3, {“k1”: “v1”, “k2”: “v2”}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2)#<class ‘list’> [1, [‘a’, ‘b’, ‘c’], 3, {‘k1’: ‘v1’, ‘k2’: ‘v2’}]

import json
f = open(‘json_file’,‘w’)
dic = {‘k1’:‘v1’,‘k2’:‘v2’,‘k3’:‘v3’}
json.dump(dic,f) #dump 方法接收一个文件句柄,直接将字典转换成 json 字符串写入文件
f.close()

f = open(‘json_file’)
dic2 = json.load(f) #load 方法接收一个文件句柄,直接将文件中的 json 字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)

import json
f = open(‘file’,‘w’)
json.dump({‘国籍’:‘中国’},f)
ret = json.dumps({‘国籍’:‘中国’})
f.write(ret+‘\n’)
json.dump({‘国籍’:‘美国’},f,ensure_ascii=False)
ret = json.dumps({‘国籍’:‘美国’},ensure_ascii=False)
f.write(ret+‘\n’)
f.close()