序列化模块
2019-08-20 本文已影响0人
Yanl__
json
- 通用的序列化格式
- 只有很少一部分数据类型能够通过json转化成字符串
dumps 序列化方法 (数字,字符串,列表,字典,元组(元组序列化成str,反序列化为列表))
loads 反序列化方法
##########################
dump
import json
dic = {1:'a',2:'b'}
f = open('file', 'w', encoding='utf-8')
json.dump(dic, f)
# json.dump(dic, f, ensure_ascii=False) ensure_ascii 设置为false可以在文件中显示中文,否则显示bytes
f.close()
load
f = open('file')
res = json.load(f)
f.close()
print(res)
pickle
- 所有的python中的数据类型都可以转化成字符串形式
- pickle序列化的内容只有python能理解
- 且部分反序列化依赖python代码
(和json一样有四个方法,dumps, loads,dump,load)由于是dumps是转成二进制内容的,所以通过文件操作时,需要用wb or rb的方式
import pickle
dic = {'k1':'v1','k2':'v2'}
str_dic = pickle.dumps(dic)
print(str_dic) # 一串二进制内容
- 可以多次dump和多次load同一个文件中的内容
import pickle
import time
struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file','wb')
pickle.dump(struct_time1,f) # 一次dump
pickle.dump(struct_time2,f) # 第二次dump
f.close()
f = open('pickle_file','rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year)
print(struct_time2.tm_year)
f.close()
shelve
- 序列化句柄
- 使用句柄直接操作
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5} # 直接对文件句柄进行操作,就可以写入数据
f.close()
import shelve
f1 = shelve.open('shelve_file')
# f1 = shelve.open('shelve_file', writeback = True) writeback设置为True,可以对对象进行修改,但是会增加额外的内存消耗,并且在DB close()的时候会将所有对象进行重新写入,因为shelve不知道哪些对象没有修改。
existing = f1['key'] # 取出数据的时候只需要直接用key获取,如果key不存在,会报错
f1.close()
print(existing)