序列化 数据类型---》str 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
反序列化 str---》数据类型
序列化三大方法:json ***** pickle **** shelva ***
序列化的目的
1、以某种存储形式使自定义对象持久化; 2、将对象从一个地方传递到另一个地方。 3、使程序更具维护性。
一、json
四种方法:dumps loads 在内存角度的操作
dump load 和文件操作相关是序列化操作
优点:通用的序列化方法
缺点:只有很少的一部分数据类型可以通过json转换: dict str tuple (set不可以)
1.dumps序列化
import json dic={'a':1,'m':2} str_d=json.dumps(dic) print(type(str_d),str_d) #<class 'str'> {"m": 2, "a": 1} str 数据类型 m a 键值都变成了双引号 #注意,json转换完的字符串类型的字典中的字符串是由""表示的
2.loads反序列化
dic='{"a":1,"m":2}' dic_d=json.loads(dic) print(type(dic_d),dic_d) #<class 'dict'> {'a': 1, 'm': 2} dict数据类型 #注意:要被反序列化的内容必须是str类型
3. dump 序列化 和 和文件操作相关
import json f=open('文件','w',encoding='utf-8') dic={'k':1,'k2':2,'k3':3} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 json.dump(dic,f) #再次写入,是可以的,但是在反序列化的时候不支持一次性读取,load是一行一行的读 f.close()
# 不支持分次load,多次序列化写入,还要反序列化的解决方法:
首先实现 一行一行序列化写入
l = [{'k':'111'},{'k2':'111'},{'k3':'111'}] #转为列表为了下面的循环 f = open('file','w') import json for dic in l: str_d=json.dumps(dic) f.write(str_d+' ') f.close()
其次实现反序列化实现一行写出
import json f=open('file','r') l=[] for i in f : ret=json.loads(i.strip()) l.append(ret) f.close() print(l) # [{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
4.load 反序列化
f=open('文件','w',encoding='utf-8') dic={'k':1,'k2':2,'k3':3} json.dump(dic,f) f=open('文件','r',encoding='utf-8') ret=json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(ret),ret) #得到一个bytes类型的
5.ensure_ascii
json dumps有个参数 ensure_ascii 默认是True 序列化写进文件是不看懂的byts类型,如果想看就要改成False
import json f = open('file','w',encoding='utf-8') json.dump({'国籍':'中国'},f) ret = json.dumps({'国籍':'中国'}) f.write(ret+' ') {"u56fdu7c4d": "u4e2du56fd"}{"u56fdu7c4d": "u4e2du56fd"}看不
更改参数ensure_ascii=False json.dump({'国籍':'美国'},f,ensure_ascii=False) ret = json.dumps({'国籍':'美国'},ensure_ascii=False) f.write(ret+' ') f.close() #{"国籍": "美国"}{"国籍": "美国"}
二、pickle
优点:可以把python中任意的数据类型序列化, 支持分次load
缺点:pickle序列化的内容只有python能理解,且部分反序列化依赖python代码
注释:dumps之后得到bytes类型,所以文件打开要用 wb
四种方法:dumps loads
dump load 和文件操作相关是序列化操作
1 dumps
dic={'a':1,'b':2,'c':3} str_d=pickle.dumps(dic) print(type(str_d),str_d) #<class 'bytes'> b'x80x03}qx00(Xx01x00x00x00bqx01Kx02Xx01x00x00x00aqx02Kx01Xx01x00x00x00cqx03Kx03u.' 1 loads ret=pickle.loads(str_d) print(type(ret),ret) #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}
2 loads
ret=pickle.loads(str_d) print(type(ret),ret) #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}
3:dump
f=open('文件','wb') dic={'a':1,'b':2,'c':3} dic_d=pickle.dump(dic,f) print(dic_d) #None f.close()
4.load #反序列化
f=open('文件','rb') ret=pickle.load(f) print(ret) #{'c': 3, 'b': 2, 'a': 1}
三、shelva python3 中添加的
序列化句柄
使用句柄直接操作,非常方便
加上writeback=True ,则对于字符串的任何操作都可以被记录
import shelve f=shelve.open('file1') f['key']={'cc':1,'mm':2} f.close()
f1=shelve.open('file1') ret=f1['key'] print(ret) #{'mm': 2, 'cc': 1} #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错 f.close()
1.writeback 的用法
import shelve f=shelve.open('file1') f['key']={'cc':1,'mm':2} print(f['key']) #{'cc': 1, 'mm': 2} f['key']['nem_name']='aaaaaaaaa' f.close() f1=shelve.open('file1',writeback=True) f1['key']['nem']='bbb' print(f1['key']) #{'cc': 1, 'mm': 2, 'nem': 'bbb'} f1.close()