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)

猜你喜欢

转载自www.cnblogs.com/dong-/p/9451057.html