json模塊,pickle模塊,shelve模塊
阿新 • • 發佈:2018-03-04
tor font type AD values username import ict 文件句柄
一、什麽叫序列化
將原本的字典、列表等內容轉換成一個字符串的過程就叫做序列化。
二、序列化的目的
1、以某種存儲形式使自定義對象持久化;
2、將對象從一個地方傳遞到另一個地方。
3、使程序更具維護性。
三、
只有字符串能寫入文件中
能再網絡上傳輸的只能是bytes --- 字符串
把要傳輸的和要儲存的內容 轉換成 字符
字符串 轉換回 要傳輸和儲存的內容
四、序列化只有兩種作用
網絡傳輸
數據持久化 - 寫在文件裏
五、json模塊
json 是各個語言通用的,數據類型
1.在網絡上傳輸,比較頻繁
ret = json.dumps(數據結構)
print(json.loads(ret))
2.dump,load用在文件的操作數據類型的序列化與反序列化上
json.dump(數據結構,文件f)
json.load(f)
dumps,dump(序列化)
字典,列表 ---------------------------》字符串
loads,load(反序列化)
註意:元組相當於列表進行序列化,但一般不會用
例子1:dumps,loads例題 d = {‘key1‘:‘values1‘,‘key2‘:‘values2‘} ret = json.dumps(d) print(d,type(ret)) #<class ‘str‘> print(json.loads(ret),type(json.loads(ret))) #<class ‘dict‘> 例子2:dump,load例題 先序列化再寫,只能操作一個字典 with open("log","w",encoding="utf-8") as f1: json.dump(d,f1,ensure_ascii=False) #True 中文寫進去是以gbk的方式寫進去的 with open("log","r",encoding="utf-8") as f1: for line in f1: print(json.loads(line.strip())) 例子3:ensure_ascii關鍵字參數 data= {‘username‘:[‘李華‘,‘二楞子‘],‘sex‘:‘male‘,‘age‘:16} with open("log","w",encoding="utf-8") as f1: json.dump(data,f1,ensure_ascii=False) with open("log", "r", encoding="utf-8") as f1: print(json.load(f1)) 例子4:格式化輸出 data = {‘username‘:[‘李華‘,‘二楞子‘],‘sex‘:‘male‘,‘age‘:16} # (數據結構,倒敘,前面空格數量,","代替",") json_dic2 = json.dumps(data,sort_keys=True,indent=10,separators=(‘,‘,‘:‘),ensure_ascii=False) print(json_dic2)
六、pickle
用於序列化的兩個模塊json,用於字符串和python數據類型間進行轉換
pickle,用於python特有的類型和python的數據類型間進行轉換
pickle 模塊提供了四個功能:dumps、dump(序列化,存)、
loads(反序列化,讀)、load (不僅可以序列化字典,列表...可以把python中任意的數據類型序列化)
例題1:dumps,loads dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘} str_dic = pickle.dumps(dic) print(str_dic) #一串二進制內容 dic2 = pickle.loads(str_dic) print(dic2) #字典 例題2:dump load import time s_time = time.localtime(1000000000) print(s_time) with open("log","wb") as f1: s_time = pickle.dump(s_time,f1) with open("log","rb") as f1: s_time2 = pickle.load(f1) print(s_time2) 例題3:dump load dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘} with open("log","wb") as f1: pickle.dump(dic,f1) pickle.dump(dic, f1) with open("log","rb") as f1: print(pickle.load(f1)) print(pickle.load(f1))
七、json 和 pickle 的區別
1.pickle模塊 dumps之後是bytes
2.pickle模塊 dump之後的內容在文件中是亂的
3.pickle模塊可以連續dump數據進入文件,然後連續load出來
4.pickle可以任意的將python中的數據類型序列化
json只能對列表 字典 進行序列化
class A:pass # 程序
a = A()
b = pickle.dumps(a)
print(b)
print(pickle.loads(b))
八、shelve
shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。
shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。
(存取存取)
import shelve with shelve.open(‘shelve_file‘) as f1: f1[‘key‘] = {‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} #直接對文件句柄操作,就可以存入數據 with shelve.open(‘shelve_file‘) as f1: existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報 print(existing) # key:{‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} with shelve.open(‘shelve_file‘,writeback=True) as f1: f1[‘key‘][‘new_value‘] = ‘this was not here before‘ with shelve.open(‘shelve_file‘) as f1: print(f1[‘key‘]) # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘, ‘new_value‘: ‘this was not here before‘}
json模塊,pickle模塊,shelve模塊