前言
今天就开始内置模块的分享了,序列化模块作为比较重要的一部分,先对其进行一个概括性的陈述,它就是将一种数据结构转换化为特殊的序列(特殊的字符串、bytes)并且还可以反转回去,主要分为三个部分:
- json模块:是所有语言公认的一种序列,(最常用的)所以支持的python的数据结构有限:int str bool dict list(tuple) None float
- pickle模块:只能是python语言中使用的序列化模块,支持python所有的数据;类型以及对象
- shevle模块:只能是文件存取
json序列
第一部分json模块
两对四个方法
-
dumps、loads主要用于网络传输,可以用于文件存取
-
使用方法:模拟网络传输(网络传输中以bytes的形式)
-
import json dic = {'name': 'LY', 'age': '20', 'hobby': 'bass'} print(dic) ret = json.dumps(dic) print(ret, type(ret)) #{"name": "LY", "age": "20", "hobby": "bass"} <class 'str'> 首先将字典转化为特殊的字符串,可以细节的看到,特殊字符串中的引号为双引号 接着会将特殊字符串转化为bytes模式 ret1 = ret.encode(encoding="utf-8") 接收方会将接收到的bytes解码 ret2 = ret1.decode(encoding="utf-8") ret3 = json.loads(ret2) print(ret3) #{'name': 'LY', 'age': '20', 'hobby': 'bass'} 使用loads反转,又会将特殊字符串转换为发送发传输的数据,这便是简单的网络传输的模拟
- 参数
-
1、ensure_ascii 当它为True的时候,所有非ASCII码字符显示为\uXXXX序列 True、False两种参数
-
import json lst = ["刘", "xxy", 3] lst1 = json.dumps(lst, ensure_ascii=False) lst2 = json.dumps(lst, ensure_ascii=True) print(lst1)#["刘", "xxy", 3] print(lst2)#["\u5218", "xxy", 3]
-
2、sort_keys 将数据根据keys的值进行排序 True、False两种参数
-
import json tu = {'n': 1, 'p': 2, 'a': 3} tu1 = json.dumps(tu, sort_keys=True) tu2 = json.dumps(tu, sort_keys=False) print(tu1)#{"a": 3, "n": 1, "p": 2} print(tu2)#{"n": 1, "p": 2, "a": 3}
-
-
dump load:单个数据的存取文件
-
with open("ret1.json", mode="w", encoding="utf-8") as f: json.dump(dic, f) with open("ret1.json", mode="r", encoding="utf-8") as f1: ret4 = json.load(f1) print(ret4)
-
-
# 多个数据如何存储在一个文件中 import json dic1 = {'name': 'LY', 'password': '123', 'age': '20'} dic2 = {'name': 'XL', 'password': '123', 'age': '20'} dic3 = {'name': 'YL', 'password': '123', 'age': '20'} with open('ret3.json', encoding='utf-8', mode='a') as f2: f2.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')with open('ret3.json', encoding='utf-8', mode='r') as f3: for line in f3: ret = json.loads(line) print(ret, type(line))
pickle序列化
同样两对四个方法
-
dumps、loads 只能是网络传输
-
模拟网络传输 可直接转化为bytes
-
import pickle li = ['LY', '鹿晗', 3, '黑人'] ret = pickle.dumps(li) print(ret) #b'\x80\x04\x95\x1e\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x02LY\x94\x8c\x06\xe9\xb9\xbf\xe6\x99\x97\x94K\x03\x8c\x06\xe9\xbb\x91\xe4\xba\xba\x94e.' #直接转换为bytes ret1 = pickle.loads(ret) print(ret1,type(ret1)) #['LY', '鹿晗', 3, '黑人'] <class 'list'>
-
-
dump、load 数据结构存取文件
-
import pickle l1 = ['LY', '鹿晗', 3, '黑人'] with open('pickle练习.pickle', mode='wb') as f3: pickle.dump(l1, f3) with open('pickle练习.pickle', mode='rb') as f4: ret5 = pickle.load(f4) print(ret5, type(ret5)) #['LY', '鹿晗', 3, '黑人'] <class 'list'>
-
-
#多个数据写入文件 l1 = ['LY', '鹿晗', 3, '黑人'] l2 = ['YL', '鹿晗', 3, '黑人'] l3 = ['LYY', '鹿晗', 3, '黑人'] with open('pickle多个写入.pickle', mode='wb') as f1: pickle.dump(l1, f1) pickle.dump(l2, f1) pickle.dump(l3, f1) with open('pickle多个写入.pickle', mode='rb') as f2: ret1 = pickle.load(f2) ret2 = pickle.load(f2) ret3 = pickle.load(f2) print(ret1, ret2, ret3)
shelve序列化
Python当中数据储存的方案,类似key-value数据库,便于保存Python对象,shelve只有一个open()函数,用来打开指定的文件(字典),会返回一个对象shelf,shelf也是类似字典的对象。
open()函数的格式:shelve.open(file_name, flag=‘’, writeback=True\False)
flag:打开数据存储文件的格式:
- r 只读模式打开存在数据的文件
- w 读写模式打开存在数据的文件
- c 读写模式打开存在数据的文件,如果不存在则创建
- n 总是创建一个新的、空数据的文件
writeback:一般情况下,我们通过shelve.open()一个对象后,只能进行一次赋值,但是可以通过设定writeback:True来实现,这里writeback的默认值为False。
因为他返回的对象类似字典,操作也与字典类似
例如:
import shelve
db = shelve.open('ly') #打开文件
print db['ly'] #向从字典中获取键的方式一样读取内容
db.close() #关闭文件