91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中序列化是什么

發布時間:2020-08-04 15:07:07 來源:億速云 閱讀:185 作者:清晨 欄目:編程語言

這篇文章將為大家詳細講解有關Python中序列化是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

程序運行時,所有的變量都儲存在內存中,程序結束運行時,這些占用的內存將被系統回收,無法長期儲存,將這些變量轉換為可儲存或可通過網絡傳輸的過程稱之為序列化(pickling),序列化后就可以將它們儲存在磁盤或通過網絡進行傳輸。

1.pickle序列化

Python提供了pickle模塊來實現變量的序列化,這個模塊可以將變量轉換成字節碼(bytes)形式儲存,還能將儲存的序列化字節碼重新還原成數據對象;

注意:pickle僅能用于python程序之間交換數據,且不同的版本之間并不兼容,需要和其他程序進行通信時,請使用json序列化,它可以在不同編程語言間共享數據。

a.pickle普通對象序列化

先來看一個小實例,使用pickle模塊,將幾個不同的對象序列化,這些序列化后的對象可用于網絡傳輸或儲存到磁盤文件中:

#!/usr/bin/env python3
#coding=utf-8
import os
import pickle
#創建一個字典對象和一個字符串對象
d=dict(one=1,two=2,three=3)
s="python"
print(d) #輸出{'three': 3, 'two': 2, 'one': 1}
print(s) #輸出
 
#將這兩個對象序列化,nd和ns僅保存在內存中,可用于網絡傳輸
nd=pickle.dumps(d)
ns=pickle.dumps(s)
print(nd) #輸出字節碼"b'\x80\x03}q\x00...."
print(ns) #輸出字節碼"b'\x80\x03X\x11...."
 
#將序列化后的對象重新還原成數據(假設接收端接收到這些數據后,就能夠這樣還原)
nd=pickle.loads(nd)
ns=pickle.loads(ns)
print(nd) #輸出{'three': 3, 'two': 2, 'one': 1}
print(ns) #輸出
 
#創建一個文件testfile,接收字節碼(wb),將d對象中的數據寫入其中,
#用于本地不同應用程序之間數據交換(此時如果我們打開testfile文件,
#就會看到一些類似亂碼一樣的字符,實際上是d對象序列化后的數據)
with open("testfile","wb") as f1:
    pickle.dump(d,f1)
 
#從testfile文件中讀取字節碼,還原成數據
if os.path.isfile("testfile"):
    with open("testfile","rb") as f2:
        print(f2.read()) #輸出"b'\x80\x03}q\x0...."
#因為上一步讀取了數據,指針位置要重新設置成起始位置,
#這僅僅是為了演示給大家看,上面print和seek這兩句可以不寫
        f2.seek(0)
        d=pickle.load(f2) #讀取f2中的數據還原
        print(d) #輸出{'three': 3, 'two': 2, 'one': 1}

總結:僅在內存中序列化和還原,使用dumps()和loads(),要將數據序列化后保存到文件中使用dump(),從文件中還原數據使用load(),兩者只有一個s的區別,注意不要混淆。

b.pickle類序列化

有時候我們可能要傳輸或保存一個類對象與其中所有的數據,python中實現類的序列化十分簡單,與對象序列化沒有什么區別,請看下面的實例:

#!/usr/bin/env python3
#coding=utf-8
import pickle
########
class A:
    #--------
    def __init__(self,name="py",website="python"):
        self.name=name
        self.website=website
x=A()
x.name="晴刃"
 
#序列化類實例x,可用于網絡傳輸
nx=pickle.dumps(x)
print(nx) #輸出"b'\x80\x03c__main__...."
 
#還原數據
nx=pickle.loads(nx)
print(nx) #輸出"<__main__.A object at 0x7f43c995c080>"
 
#將類對象序列化后保存到磁盤文件中,可用于程序間數據交換
with open("testfile","wb") as f1:
    pickle.dump(x,f1)
 
#讀取文件中的數據還原
with open("testfile","rb") as f1:
    y=pickle.load(f1)
print(y.name) #輸出"晴刃"
print(y.website) #輸出

2.json序列化

如果要在不同的編程語言之間傳遞對象,可以使用python的json模塊對數據進行序列化,json序列化后所有數據都被表示成字符串形式,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸,但在類數據轉換時會稍微有點麻煩,沒有pickle那么方便。

a.json普通對象序列化

#!/usr/bin/env python3
#coding=utf-8
import json
 
#創建一個字典對象和一個浮點數對象
d=dict(one=1,two=2,three=3)
f=3.14
 
print(type(d)) #<class 'dict'>
print(type(f)) #<class 'float'>
 
#普通對象的序列化與pickle相同
nd=json.dumps(d)
nf=json.dumps(f)
 
#轉換后所有對象都變成了字符串類型<class 'str'>
print(type(nd))
print(type(nf))
print(nd) #"{"three": 3, "two": 2, "one": 1}"
print(nf) #"3.14"
 
#還原數據
nd=json.loads(nd)
nf=json.loads(nf)
print(type(nd)) #<class 'dict'>
print(type(nf)) #<class 'float'>
 
#將d對象序列化后儲存到testfile文件中
with open("testfile","w") as f1:
    json.dump(d,f1)
 
#從testfile文件中讀取數據并還原
with open("testfile","r") as f1:
    y=json.load(f1)
    print(type(y)) #<class 'dict'>

b.json類序列化

使用json序列化類會稍顯復雜,因為json的dump方法不知道如何將一個類轉換成字符串,需要我們自己指定一個轉換函數,請看下面的實例:

#!/usr/bin/env python3
#coding=utf-8
import json
 
class A(object):
    def __init__(self,name="py",website="python"):
        self.name=name
        self.website=website
#初始化一個類實例
a=A()
 
#創建一個函數,將類A中的對象和數據轉換成字典的形式返回
def  classA2dict(c):
    return {"name":c.name,"website":c.website}
 
#將a使用json序列化,參數default告訴python解釋器,將前面的對象a傳遞給后面的classA2dict函數處理,
#classA2dict函數會返回一個字典類型,這個類型中包含了實例a中所有對象和數據的"鍵值對",
#然后dumps函數將這個返回的字典類型序列化成字符串類型
x=json.dumps(a,default=classA2dict)
#如果想偷懶不寫classA2dict函數,有一種簡便方法,使用匿名函數,并且調用基類的__dict__函數,
#這個函數會完成和classA2dict函數相同的功能,即將一個類的所有屬性轉換成字典"鍵值對"的形式
#x=json.dumps(a,default=lambda obj:obj.__dict__)
 
print(type(x)) #<class 'str'>
print(x) #"{"website": "python", "name": "py"}"
 
#字典類型轉換成類返回
def dict2classA(d):
    return A(d["name"],d["website"])
 
#將json序列后的數據還原成類,object_hook參數將x轉換成字典類型,并傳遞給dict2classA函數處理,
#dict2classA函數會讀取這個字典中的每個鍵,將值傳入A類進行初始化,返回一個類對象
x=json.loads(x,object_hook=dict2classA)
print(type(x)) #<class '__main__.A'>
print(x.website) 
 
#將序列化的類寫入文件testfile中
with open("testfile","w") as f1:
    json.dump(a,f1,default=classA2dict)
#讀取testfile中的數據還原
with open("testfile","r") as f2:
    y=json.load(f2,object_hook=dict2classA)
    print(y.name)

關于Python中序列化是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扎赉特旗| 芮城县| 福州市| 河东区| 招远市| 江都市| 铁力市| 天峻县| 福清市| 科技| 广昌县| 三河市| 石阡县| 南京市| 康保县| 永城市| 綦江县| 五原县| 东至县| 巧家县| 桃园市| 扎兰屯市| 新泰市| 英德市| 江安县| 台江县| 正镶白旗| 双桥区| 永善县| 那坡县| 武穴市| 仙游县| 叶城县| 文昌市| 张北县| 丹寨县| 桦川县| 门源| 梧州市| 库伦旗| 衡山县|