python 序列化模块
一. json 模块 :
import json # json.dump()/dumps() 字典的key必须是字符串格式,如果key是数字,会强制转换为字符串格式 # json.load()/loads() 操作的字符串必须是""符号, # dic = {1:2,3:4} # a = json.dumps(dic) #将传入的数据类型转换为字符串,即序列化 # # print(a)
# b = json.loads(a) #将序列化的字符串反序列化,反序列化的字典中的key也为字符串 # print(b)
# dic1 = {(1,2,3):'a','q':4} # a = json.dumps(dic1) #序列化字典时,如果key为元组,不可序列化 # print(a) #报错 # dic1 = {'a':(1,2,3),'q':4} # b = json.dumps(dic1) #序列化字典时,如果value为元组,序列化会将元组转换为列表 # print(b)
# lst =[1,2,3,4,[5,[6]]] #可以查理嵌套的数据类型 # a = json.dumps(lst) #序列化 # print(a,type(a)) # print(json.loads(a),type(json.loads(a))) #反序列化
# with open('aaa.txt',mode='w') as f: # t = (1,2,3,456,7) # json.dump(t,f) #序列化一个元组,并且直接写入文件 # with open('aaa.txt', mode='r') as f: # a = json.load(f) #反序列化,并且读取 # print(a,type(a))
#写入数据到文件 # t = (1,2,3,456,7) # dic1 = {'a':(1,2,3),'q':4} # with open('aaa.txt',mode='w') as f: #可以序列化多个数据并且写入文件,但是读不出来 # json.dump(t,f) # f.write('\n') # json.dump(dic1,f) # f.write('\n') # with open('aaa.txt',mode='r') as f: # a = json.load(f) # print(a) #多个文件写入需要用dumps 和 loads # with open('aaa.txt',mode='w') as f: # json.dumps(t) # json.dumps(dic1) # f.write(json.dumps(t) + '\n') # f.write(json.dumps(dic1) + '\n') # with open('aaa.txt', mode='r') as f: # for i in f: #遍历文件句柄 # s = json.loads(i) #对每一行的字符串反序列化 # print(s,type(s)) # 含有中文的序列 dic = {'姓':'王','名':'han'} # ret = json.dumps(dic)#序列化成编码组成的字符串 # ret1 = json.dumps(dic,ensure_ascii=False)#ensure_ascii:当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。 # print(ret,type(ret)) # print(ret1,type(ret1))
# with open('aaa.txt', mode='w') as f: # json.dump(dic,f)#以编码形式写入文件
# with open('aaa.txt', mode='r') as f: # print(json.load(f))#不影响读取 # json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间 # data = {'username':['李华','二愣子'],'sex':'male','age':16} # json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) # print(json_dic2,type(json_dic2)) #sort_keys 排序 # indent 缩进 # separators(a,b) a为元素之间的间隔符,b为键值对之间的间隔符
二. pickle模块
import pickle # dump的结果是bytes,dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式 # 支持几乎所有对象的序列化 # 对于多次dump/load的操作做了良好的处理 # dic = {'姓':'王','名':'han'} # print(pickle.dumps(dic)) #序列化成bytes # print(pickle.loads(pickle.dumps(dic)))#反序列化 # print(type(pickle.dumps(dic))) # print(type(pickle.loads(pickle.dumps(dic))))#
# with open('aaa.txt',mode='wb') as f: # pickle.dump(dic,f) #序列化后存入文件,存入的内容乱码,目前没有解决办法 # with open('aaa.txt',mode='rb') as f: # print(pickle.load(f)) # 对于实例化对象的序列化需要这个对象对应的类在内存中 # class A: # def __init__(self,name,age): # self.name = name # self.age = age # # p = A('王','18') # with open('aaa.txt',mode='wb') as f: # pickle.dump(p,f) # with open('aaa.txt',mode='rb') as f: # print(pickle.load(f).name)
注意 :
json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle
三. shelve模块
import shelve dic = {'姓':'王','名':'han'} f = shelve.open('aaa') #自动生成三个非txt文件,文件名自己定 f['h'] = dic #以用户添加的key 存入文件序列 f.close() f = shelve.open('aaa') c = f['h'] #以存入时的key 取出存入的序列 f.close() print(c)