回顾
序列
序列化
将转换为字符串类型,用于数据传输和网上传输
数据类型 字符串
json
通用的序列化格式
只有一部分数据类型可以转化为json的数据类型
json提供四种操作 dumps dump,load,loads、
dumps
import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的
输出结果<class 'str'> {"k1": "v1", "k2": "v2", "k3": "v3"}
dic1 = {1:'k1',2:'k2',3:'k3'}
b=json.dumps(dic1)
for i in b:
print(i)
输出结果为
{
"
1
"
:
"
k
1
"
,
"
2
"
:
"
k
2
"
,
"
3
"
:
"
k
3
"
}
loads:
c = json.loads(b)
print(c)
输出结果为
{'2': 'k2', '1': 'k1', '3': 'k3'}
load 与dump是与文件相关的操作
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
注意dump可以写两次,但是读取时会报错
解决 每次写入之后,用write写入换行符 读的时候用.read 而不是用load。
f = open('suibian','w')
dic = {'wo':'yaoxiangfenyiyangziyou'}
dic1 = {1:'women',2:'zainali'}
json.dump(dic,f,ensure_ascii=False)
f.write(' ')
json.dump(dic1,f,ensure_ascii=False)
f.write(' ')
f.close()
b = open('suibian','r')
a = b.read()
print(a,type(a))
f.close()
pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load
(不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)
shelve
python的shelve模块
shelve
shelve是一额简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的。然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭
这个有一个潜在的小问题,如下:
import shelve list = [1, 2, 3] she = shelve.open('test.dat') she['d'] = list she['d'].append('f')print(she['d'])
你会发现,打印后,没有‘f’ ,存储的f到哪里去了呢?其实很简单,d没有写回,你把[1,2,3]存到了d,当你再次读取she['d']的时候,she['d']只是一个拷贝,而你没有将拷贝写回,所以当你再次读取she['d']的时候,它又从源中读取了一个拷贝,所以,你新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量,如下所示
import shelve list = [1, 2, 3] she = shelve.open('test.dat') she['d'] = list temp = she['d'] temp.append('f') she['d'] = temp print(she['d'])
这样返回的结果就有‘f’了。
不过在shelve模块中,key必须为字符串,而值可以是python所支持的数据类型。
摘自https://www.cnblogs.com/caibao666/p/6531044.html