1. 程式人生 > >json模塊,pickle模塊,shelve模塊

json模塊,pickle模塊,shelve模塊

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模塊