从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件
  • 首页
  • Python
  • 34、 python序列化模块 pickle json shelve

34、 python序列化模块 pickle json shelve

发布:蔺要红05-22分类: Python

 
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  :简单、可读性清晰,占空间少
 
跨平台,跨语言,比如通过访问接口获取其他语言的数据,python接受bytes,转换成相应的数据类型处理
 
# -*- 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']







 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站