json pickle shelve
把内存数据转化成字符,叫做序列化
把字符转成内存数据类型,叫做反序列化
把内存的数据很容易写到硬盘、还可以随时再读取
#把内存数据转化成字符,叫做序列化
#把字符转成内存数据类型,叫做反序列化
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
f = open("game_status",'w')
f.write(data)
#如果直接运行则报错:TypeError: write() argument must be str, not dict,只能接受字符串,不能是字典
#更正:
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
f = open("game_status",'w',encoding='utf8')
f.write(str(data))
#此时生成了一个game_status的文件,当再读文件内容的时候,
f = open("game_status",'r',encoding='utf8')
d = f.read()
print(d['roles'])
#直接读取的话会报错:TypeError: string indices must be integers,类型错误,必须是字符
#写入的时候转成字符,但是不能从字典转成字符串
#如下案例验证:
f = open("game_status",'r',encoding='utf8')
d = f.read()
d = dict(d)
print(d['roles'])
#报错:ValueError: dictionary update sequence element #0 has length 1; 2 is required
#用eval把字典转换成字符串
f = open("game_status",'r',encoding='utf8')
d = f.read()
d = eval(d)
print(d['roles'])
#运行结果如下
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/序列化.py
[{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'hero', 'type': '张飞', 'life': 90}]
json模块
json.dumps json.loads
json.dump json.load
json.dumps
# -*- coding: UTF-8 -*-
import json
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
d = json.dumps(data) #把字典仅转成字符串
print(type(d))
print(d['roles'])
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/json模块.py
Traceback (most recent call last):
File "E:/整理版笔记/python/模块/json模块.py", line 11, in <module>
print(d['roles'])
TypeError: string indices must be integers
<class 'str'>
#报错:类型错误,因为 d 已经转换成字符串,所以用字典的方式去取数据报错
json.dumps和json.loads
如下案例:把数据类型转换成字符串,数据还是存在内存里
意义:
1、把内存数据通过网络共享给远程其他用户(远程发送必须是byte格式发送)
2、定义了不同语言之间的交互规则
纯文本:不能共享复杂的数据类型
xml :占空间稍微多
json :简单、可读性清晰,占空间少
xml :占空间稍微多
json :简单、可读性清晰,占空间少
# -*- coding: UTF-8 -*-
import json
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
d = json.dumps(data) #把字典仅转成字符串
print(type(d))
d2 = json.loads((d)) #loads把字符串转换成相应的数据类型
print(type(d2))
print(d2['roles']) # 此时再取数据-正常
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/json模块.py
<class 'str'>
<class 'dict'>
[{'type': 'pig', 'life': 50, 'role': 'monster'}, {'type': '张飞', 'life': 90, 'role': 'hero'}]
# -*- coding: UTF-8 -*-
import json
f = open('json_file','w',encoding="utf-8")
m = {'name':'lin','age':22}
n = [1,2,3,4,"yaohong"]
json.dump(m,f) #不能dump两次
json.dump(n,f)
#----------------------------------
#json_file的内容为:{"age": 22, "name": "lin"}[1, 2, 3, 4, "yaohong"]
f = open('json_file','r',encoding="utf-8")
print(json.load(f))
#此时报错:不能处理数据,dump两次
json.dump
# -*- coding: UTF-8 -*-
import json
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
#dumps仅仅是把字典转成字符串,dump可以直接写入文件
f = open("test.json",'w',encoding='utf-8')
json.dump(data,f)
json.load
# -*- coding: UTF-8 -*-
import json
f = open("test.json",'r',encoding='utf-8') #接上文,文件已经写入test.json
data = json.load(f)
print(type(data))
print(data['roles'])
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/json模块.py
<class 'dict'>
[{'life': 50, 'type': 'pig', 'role': 'monster'}, {'life': 90, 'type': '张飞', 'role': 'hero'}]
pickle模块
pickle.dumps pickle.loads
pickle.dump pickle.load
使用方法和json相同
区别:
json :str、int、tuple、list、dict /跨平台/ 不支持set(集合)
pickle: :支持python里的所有的数据类型 / 只能在python里使用/不跨平台 /可以序列化函数
内存里的区别
# -*- coding: UTF-8 -*-
import json,pickle
m = {'name':'lin','age':22}
print(type(json.dumps(m)))
print(json.dumps(m))
n = {'name':'lin','age':22}
print(type(json.dumps(n)))
print(pickle.dumps(n))
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/json模块.py
<class 'str'>
{"name": "lin", "age": 22} #不同之处
<class 'str'>
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00linq\x02X\x03\x00\x00\x00ageq\x03K\x16u.' #不同之处
写入文件的区别:
# -*- coding: UTF-8 -*-
import json,pickle
data = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
f = open("test.json",'w',encoding='utf-8')
json.dump(data,f)
data2 = {
'roles':[
{'role':'monster','type':'pig','life':50},
{'role':'hero','type':'张飞','life':90}
]
}
f2 = open("data.pkl",'wb') #写的模式必须为wb/不能带字符编码
pickle.dump(data2,f2)
读取内容
# -*- coding: UTF-8 -*-
import json,pickle
f = open("test.json",'r',encoding='utf-8')
d = json.load(f)
print(d)
f2 = open("data.pkl",'rb') #写的模式必须为rb/不能带字符编码
d2 = pickle.load(f2)
print(d2)
#E:\Python\学习\venv\Scripts\python.exe E:/整理版笔记/python/模块/json模块.py
{'roles': [{'life': 50, 'type': 'pig', 'role': 'monster'}, {'life': 90, 'type': '张飞', 'role': 'hero'}]}
{'roles': [{'life': 50, 'type': 'pig', 'role': 'monster'}, {'life': 90, 'type': '张飞', 'role': 'hero'}]}
shelve -- 用来持久化任意的Python对象
# -*- coding:utf-8 -*-
import shelve #对pickle进行了封装 可以dump和load多次
f =shelve.open('shelve_test') #打开一个文件
m = {'name':'lin','age':22}
n = [1,2,3,4,"yaohong"]
f['mm'] = m #持久化列表
f['nn'] = n
f.close()
shelve 查看 删除 新增 修改
# -*- coding:utf-8 -*-
import shelve #对pickle进行了封装 可以dump和load多次
f = shelve.open('shelve_test') #打开一个文件
print(f) #<shelve.DbfilenameShelf object at 0x0000027A9A3264A8>
print(f.keys()) #KeysView(<shelve.DbfilenameShelf object at 0x0000027A9A3264A8>)
print(list(f.keys())) #['mm', 'nn']
print(list(f.items())) #[('mm', {'name': 'lin', 'age': 22}), ('nn', [1, 2, 3, 4, 'yaohong'])]
print(f.get("mm")) #{'name': 'lin', 'age': 22}
print(f.get("nn")) #[1, 2, 3, 4, 'yaohong']
print(f['nn']) #[1, 2, 3, 4, 'yaohong']
del f['nn'] #可以删除
f.close()
f = shelve.open('shelve_test') #重新打开
print(list(f.keys())) #['mm'] / 此时只有 ['mm'] 。['nn']被删除
f['name'] = ["Lin","Yao","Hong"] #可以新增
f.close()
f = shelve.open('shelve_test') #重新打开
print(list(f.keys())) #['mm', 'name'] / 有['mm', 'name']两个
print(f.get("name")) #['Lin', 'Yao', 'Hong'] / 获取name的value
f['name'] = ["Lin","B","Hong"] #修改只能用次方法修改,不能 f['name'][1] = "B"
print(f.get("name")) #['Lin', 'B', 'Hong'] / 修改后的key(name)的value
#D:\python\python.exe F:/运维笔记/python/模块/shelve模块读.py
<shelve.DbfilenameShelf object at 0x0000027A9A3264A8>
KeysView(<shelve.DbfilenameShelf object at 0x0000027A9A3264A8>)
['mm', 'nn']
[('mm', {'name': 'lin', 'age': 22}), ('nn', [1, 2, 3, 4, 'yaohong'])]
{'name': 'lin', 'age': 22}
[1, 2, 3, 4, 'yaohong']
[1, 2, 3, 4, 'yaohong']
['mm']
['mm', 'name']
['Lin', 'Yao', 'Hong']
['Lin', 'B', 'Hong']