1. 程式人生 > >python序列化模塊

python序列化模塊

如果 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序列化模塊