序列化模块
一、定义
#序列化 —— 转向一个字符串数据类型 #序列 —— 字符串 #从数据类型 —— 字符串的过程 序列化 #从字符串 —— 数据类型 反序列化
二、相关模块
#json 通用的序列化格式,并且其他语言都用 # 但只有很少一部分数据类型可以通过json转化成字符串 #pickle 所有的python中的数据类型都可以转化成字符串形式 #序列化的内容只有python能理解 #且部分反序列化依赖代码 #shelve 有序列化句柄,使用句柄直接操作,很方便。
三、json
#json dumps序列化 loads反序列化 内存中操作 import json dic={'k':'v'} print(type(dic)) str_d=json.dumps(dic) #序列化 print(type(str_d),str_d) # <class 'dict'> # <class 'str'> {"k": "v"} #本身单引号,但是内部用到所有的字符串元素要用双引号才能识别 dic_d=json.loads(str_d) print(type(dic_d),dic_d) # <class 'dict'> {'k': 'v'} #数字,字符串,列表,字典,元组(转成列表再序列化) #集合不可以转化集合 #json dump load 文件中操作 前一个参数是内容,第二个参数是文件 dic2={'k2':'v2'} #先序列化再转进去 f=open('fff','w',encoding='utf-8') json.dump(dic2,f) f.close() # f=open('fff') #还没有读文字,不用写encoding # res=json.load(f) # f.close() #可以关闭之后再打印,因为已经读出来了 # print(type(res),res) # 上述如果内容有中文,可以使用json.dump(dic,f,ensure_ascii=False)
# 其他参数(数据,是否按键顺序排列,缩进,分隔符,是否默认ascii编码)
json_dic=json.dump(data,sort_keys=True,indent=2,seperators=(',',':'),ensure_ascii=False)
# 则写入文件的内容为中文,否则默认为bytes类型写入 # 不可以一次多步输入。 # 必须分次往里面写 # 可以json中写入时加\n,读时for一行一行读,然后每一行进行Loads
四、pickle
#pickle 提供上述loads,dumps,load,dump方法 # 并且可以多步读入 #可以序列化集合,但是dumps之后是bites类型,loads之后是正常内容 #dump之前,打开文件用wb,load之前,打开文件用rb
五、shelve
# shelve打开文件,只提供open方法 # 文件句柄,可以直接把数据类型直接写到文件中去 # 但每次打开就会创建三个文件,但是看不懂(bak,dat,dir) # 不支持多个应用同一时间往DB中写 # 一个问题:参数写flag='r',只读,但是仍然可以修改 # writebalck=True,参数用处,可以感知修改,减少出错概率,但是会增加额外的内存消耗和等待时间 import shelve f=shelve.open('shelve_file_test') f['key']={'int':5,'string':'hello'} f.close() f1=shelve.open('shelve_file_test',flag='r') existing1=f1['key'] f1['key']['int']=20 f.close() print(existing1)