一、介绍
1、分类
序列化:
数据类型->字符串
反序列化
字符串->数据类型
2、作用
文件传输和文件储存需要将数据类型转换成字符串
二、序列号模块分类
1、json
优点:编程语言中的英语,同用语言
缺点:数据类型少:数字、字符串、列表、字典、元祖(通过列表进行的)
2、pickle
优点:python的所有数据类型
缺点:不通用,只能在python中使用
3、shelve
优点:操作简单,只要使用序列化句柄操作即可
缺点:不成熟
三、json模块
1、dumps() 和 loads() 方法
importjson
dic= {'k1': 'v1'}"""dic->str,使用dumps()方法,在内存中序列化
str->dic,使用loads()方法,在内存中反序列化"""str_d=json.dumps(dic)print(str_d, type(str_d))
dic_d=json.loads(str_d)print(dic_d, type(type))"""结果:
{"k1": "v1"}
{'k1': 'v1'} """
2、dump() 和 load() 方法
importjson
dic= {'k1': 'v1'}"""json.dump(数据, 文件),序列化
json.load(文件),反序列化"""with open(file='abc', mode='w', encoding='utf-8') as f1:
json.dump(dic, f1)
with open(file='abc', mode='r', encoding='utf-8') as f1:
ret=json.load(f1)print(ret, type(ret)) #{'k1': 'v1'}
3、在文件中,一行一行序列化,一行一行反序列化,必须用dumps()和loads()方法
importjson
li= [{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}]
new_li=[]"""1.使用dumps()方法,li->str,并写入文件-逐行写入
2.使用loads()方法,str->li,并读取文件-逐行读取"""f= open('cv', mode='w', encoding='utf-8')for i inli:
s=json.dumps(i)
f.write(s+ '\n')
f.close()
f1= open('cv', mode='r', encoding='utf-8')for line inf1:
s0=json.loads(line.strip())
new_li.append(s0)print(li)
f.close()
ensure_ascii 默认参数为 False时,可以写中文
四、pickle模块
1、用法和json模块相似
2、区别
1)在使用dump()和load()方法,序列化和反序列化时,文件的mode要加b
2)在使用dump()和load()方法时,文件可以逐行序列化和反序列化,json不可以
importpickleimporttime
s_time1= time.localtime(1000000000)
s_time2= time.localtime(2000000000)
f= open('pickle_file1', 'wb')
pickle.dump(s_time1, f)
pickle.dump(s_time2, f)
f.close()
f= open('pickle_file1', 'rb')
s_time1=pickle.load(f)
s_time2=pickle.load(f)print(s_time1.tm_year)print(s_time2.tm_year)
f.close()
五、shelve模块
不常用
importshelve
f= shelve.open('shelve_file')
f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'} #直接对文件句柄操作,就可以存入数据
f.close()
f1= shelve.open('shelve_file')
existing= f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()print(existing)
ps:涉及到反序列化的问题,用双引号