python序列化模塊
阿新 • • 發佈:2018-08-10
如果 type 操作 結構 結果 utf-8 反序列化 pic 對象的序列化
#什麽叫序列化模塊: # # 將原本的字典,列表等內容轉換成一個字符串的過程就叫做序列化 # #序列化的目的: # #1.以某種存儲形式使自定義對象持久化 # #2.將對象從一個地方傳遞到另外一個地方 # #3.使程序更具維護性. # # str>>>> 反序列化>>>>數據結構 # # 數據結構>>>>序列化>>>>>>>str # # # json # # json模塊提供了四個功能:dumps dump loads load # import json # # dumps 和 loads # dic = {"k1":"v1","k2":"v2","k3":"v3"} # str_dic = json.dumps(dic) # 序列化:將一個字典轉換成一個字符串 # print(type(str_dic),str_dic) # <class ‘str‘> {"k1": "v1", "k2": "v2", "k3": "v3"} # # 註意: json轉換完的字符串類型的字典中的字符串是由""(雙標點)表示 # # dic2 = json.loads(str_dic) # 反序列化:將一個字符串格式的字典轉換成一個字典 # print(type(dic2),dic2) # <class ‘dict‘> {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘} # #註意: 用json的loads功能處理的字符串類型的字典中的字符串必須由""表示 # # list_dic = [1,[‘a‘,‘b‘,‘c‘],3,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}] # str_dic = json.dumps(list_dic) # 可以處理嵌套的數據類型 # print(type(str_dic),str_dic) # <class ‘str‘> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] # list_dic2 = json.loads(str_dic) # print(type(list_dic2),list_dic2) # <class ‘list‘> [1, [‘a‘, ‘b‘, ‘c‘], 3, {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}] # # # # dump 和load # # f = open(‘json_file‘,‘w‘) # dic4 = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘} # json.dump(dic4,f) # dump方法接收一個文件句柄,直接將字典轉換成hson字符串後寫入文件 # f.close() # 關閉文件 # # f = open(‘json_file‘) # dic5 = json.load(f) # load方法接收一個文件句柄,直接將文件中的字符串轉換成數據結構返回 # f.close() # print(type(dic5),dic5) # <class ‘list‘> [1, [‘a‘, ‘b‘, ‘c‘], 3, {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}] #import json # dumps和dump中ensure_ascii關鍵字 # f = open(‘file‘,‘w‘,encoding="utf-8") # json.dump({‘國籍‘:‘中國‘},f) # ret = json.dumps({‘國際‘:‘中國‘}) # f.write(ret+"\n") # 寫入之後裏面是字節碼 # f.close() # # json.dump({‘國籍‘:‘中國‘},f,ensure_ascii=False) # ret1 = json.dumps({‘國籍‘:‘中國‘},ensure_ascii=False) # f.write(ret1+"\n") # 寫入之後顯示中文 # f.close() #json的格式化輸出 # import json # data = {‘username‘:[‘李華‘,‘二楞子‘],‘sex‘:‘male‘,‘age‘:16} # json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(‘,‘,‘:‘),ensure_ascii=False) # print(json_dic2) # 為了用戶方便看,存入文件浪費內存 # 結果: #{ # "age":16, # "sex":"male", # "username":[ # "李華", # "二楞子" # ] # } #json用法寫的一些註意事項 #import json #json格式的限制1,json格式的key必須是字符串數據類型 #json格式中的字符串只能是""(雙引號) #如果是數字為key,那麽dump之後會強行轉成字符串數據類型 # dic = {1:2,3:4} # str_dic = json.dumps(dic) # print(type(str_dic),str_dic) # <class ‘str‘> {"1": 2, "3": 4} # new_dic = json.loads(str_dic) # print(type(new_dic),new_dic) # <class ‘dict‘> {‘1‘: 2, ‘3‘: 4} # json是否支持元組,對元組做value的字典會把元組強制轉換成列表 # dic = {‘abc‘:(1,2,3)} # str_dic = json.dumps(dic) # print(type(str_dic),str_dic) # <class ‘str‘> {"abc": [1, 2, 3]} 轉成列表 # new_dic = json.loads(str_dic) # print(new_dic) # {‘abc‘: [1, 2, 3]} 轉換回去value還是列表 #json是否支持元組做key,不支持 # dic = {(1,2,3):‘abc‘} # str_dic = json.dumps(dic) # 報錯 鍵必須是str、int、float、bool或None,而不是tuple # 對列表的dump # lst = ["aaa",123,‘bbb‘,4.66] # with open(‘json_demo‘,‘w‘) as f: # json.dump(lst,f) # with open(‘json_demo‘) as f: # ret = json.load(f) # print(ret) # [‘aaa‘, 123, ‘bbb‘, 4.66] # #能不能多次dump數據到文件裏,可以多次dump到文件裏但是不能load出來 # dic = {‘abc‘:(1,2,3)} # lst = ["avc",123,44,34] # with open(‘json_demo‘,‘w‘) as f: # json.dump(lst,f) # json.dump(dic,f) # 多次dump到文件 # with open(‘json_demo‘) as f: # ret = json.load(f) # 報錯 # print(ret) # #想dump多個數據進入文件,用dumps # dic = {‘abc‘:(1,2,3)} # lst = [‘abc‘,123] # with open(‘json_demo‘,‘w‘) as f: # str_lst = json.dumps(lst) # str_dic = json.dumps(dic) # f.write(str_lst+"\n") # f.write(str_dic+"\n") # # with open(‘json_demo‘) as f: # for line in f: # ret = json.loads(line) # print(ret) # 全部取出 # 結果: #[‘abc‘, 123] #{‘abc‘: [1, 2, 3]} # 中文格式的 ensure_ascii = False # dic = {‘ac‘:(1,23,3),"國家":"中國"} # ret = json.dumps(dic,ensure_ascii=False) # print(ret) # {"ac": [1, 23, 3], "國家": "中國"} # # dic_new = json.loads(ret) # print(dic_new) # {‘ac‘: [1, 23, 3], ‘國家‘: ‘中國‘} # 集合set不能被dump和dumps # pickle模塊的四個功能:dumps,dump(序列化,存),loads(反序列化,讀),load # pickle可以將python中任意的數據類型序列化 #dump的結果是bytes,dump用的f文件句柄需要以‘wb‘的形式打開,load所用的f是‘rb‘模式讀取 #幾乎支持所有數據類的序列化 #對於對象的序列化需要這個對象對象的類在內存中 #對於多次dump\load的操作做了良好的處理 #import pickle # dic = {1:(1,2,3),(‘a‘,‘b‘):4} # pic_dic = pickle.dumps(dic) # print(type(pic_dic),pic_dic) # <class ‘bytes‘> b‘\x80\x03}q\x00(K\x01K\ bytse類型 # # new_dic = pickle.loads(pic_dic) # print(new_dic) # {1: (1, 2, 3), (‘a‘, ‘b‘): 4} #pickle支持幾乎所有對象的 # class Student: # def __init__(self,name,age): # self.name = name # self.age = age # alex = Student("alex",40) # ret = pickle.dumps(alex) # print(ret) # 字節 # # pic_ret = pickle.loads(ret) # print(pic_ret) # <__main__.Student object at 0x0000000002696EB8> # print(pic_ret.name) #alex # print(pic_ret.age) # 40 import pickle # class Student: # def __init__(self,name,age): # self.name = name # self.age = age # alex = Student("alex",80) # with open(‘pickle_demo‘,‘wb‘) as f: # pickle.dump(alex,f) # with open(‘pickle_demo‘,"rb") as f: # ret = pickle.load(f) # print(ret) # <__main__.Student object at 0x00000000028A6358> # print(ret.name) # # with open(‘pickle_demo‘,‘wb‘) as f: # pickle.dump({‘k1‘:‘v1‘},f) # pickle.dump({‘k2‘:‘v2‘},f) # # with open(‘pickle_demo‘,‘rb‘) as f: # 不能用for循環,不知道有多少文件 # while 1: # try: # print(pickle.load(f)) # except EOFError: # 異常捕獲 # break #結果 # {‘k1‘: ‘v1‘} # {‘k2‘: ‘v2‘} #shelve 序列化工具只有一個open方法 import shelve f = shelve.open(‘shelve_demo‘) f[‘key‘] = {‘k1‘:(1,2,3),‘k2‘:‘v2‘} f.close() f = shelve.open(‘shelve_demo‘) content = f[‘key‘] f.close() print(content) # {‘k1‘: (1, 2, 3), ‘k2‘: ‘v2‘} #shelve 如果寫定的一個文件,改動的比較少,讀取比較多,且大部分讀取都要 #基於某個key獲得某個value
python序列化模塊