溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中序列化與反序列化的區(qū)別有哪些

發(fā)布時(shí)間:2020-11-09 16:49:40 來(lái)源:億速云 閱讀:299 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

Python中序列化與反序列化的區(qū)別有哪些?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

序列化是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)(存在內(nèi)存中)寫(xiě)入到臨時(shí)或持久性存儲(chǔ)區(qū)(硬盤(pán))。以后,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。

實(shí)現(xiàn)對(duì)象的序列化和反序列化在python中有兩種方式:json 和 pickle。

其中json用于字符串 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換,pickle用于python特有的類型 和 python的數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換,pickle是python特有的。

1、JSON序列化:json.dumps()

info = {
  "name":"tj",
  "age":22
}
import json
print(info)
print(type(info))
print(json.dumps(info))
print(type(json.dumps(info)))

f = open("test.txt","w")
# f.write(info)  # TypeError: write() argument must be str, not dict
f.write(json.dumps(info)) # 正常寫(xiě)入文件 f.write(json.dumps(info)) 等價(jià)于 json.dump(info, f)
f.close()

>>>
{'name': 'tj', 'age': 22}
<class 'dict'>
{"name": "tj", "age": 22}
<class 'str'>

2、JSON反序列化:json.loads()

f = open("test.txt","r")
# print(f.read()["age"]) #TypeError: string indices must be integers
data = json.loads(f.read()) # data = json.loads(f.read()) 等價(jià)于 data = json.load(f)
print(data["age"])
f.close()

>>>
22

注意:對(duì)于以下這種情況json就不能處理了

import json
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}
f = open("test2.txt","w")
f.write(json.dumps(info)) #TypeError: Object of type function is not JSON serializable
f.close()

所以:json用于字符串 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換

3、pickle序列化:pickle.dumps()

import pickle
def hello(name):
  print("hello,",name)
info = {
  "name":"tj",
  "age":22,
  "func":hello
}

print(pickle.dumps(info)) #可見(jiàn)pickle序列化的結(jié)果輸出為二進(jìn)制,所以應(yīng)使用wb的方式往文件中寫(xiě)
f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等價(jià)于 pickle.dump(info,f)
f.close()

>>>
b'\x80\x04\x957\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04alex\x94\x8c\x03age\x94K\x16\x8c\x04func\x94\x8c\x08__main__\x94\x8c\x05hello\x94\x93\x94u.'

對(duì)于函數(shù)hello,序列化的不是內(nèi)存地址,而是整個(gè)數(shù)據(jù)對(duì)象,函數(shù)可以序列化。

4、pickle反序列化:pickle.loads()

f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 等價(jià)于data = pickle.load(f)
print(data)
print(data["name"])
print(data["func"])

>>>
{'name': 'tj', 'age': 22, 'func': <function hello at 0x00000179EF69C040>}
tj
<function hello at 0x00000179EF69C040>

5、多次序列化與反序列化

1)json

import json
info = {
  "name":"tj",
  "age":22
}

f = open("test3.txt","w")
f.write(json.dumps(info))
info['age'] = 21
f.write(json.dumps(info))
f.close()
# 
>>>
序列化兩次后test3中的內(nèi)容
test3.txt: {"name": "tj", "age": 22}{"name": "tj", "age": 21}

f = open("test3.txt","r")
# 報(bào)錯(cuò),py3以上,多次dumps的文件反序列化報(bào)錯(cuò),py2多次dumps的文件也能被反序列化,先序列化的先被反序列化
data = json.loads(f.read()) # json.decoder.JSONDecodeError
f.close()
print(data)

2)pickle

import pickle

info = {
  "name":"tj",
  "age":22
}

f = open("test2.txt","wb")
f.write(pickle.dumps(info)) # 等價(jià)于 pickle.dump(info,f)
info["sex"] = "女"
f.write(pickle.dumps(info)) # 等價(jià)于 pickle.dump(info,f)
f.close()

>>>
序列化兩次后test2.txt中的內(nèi)容
test2.txt: &#65533;&#65533;    }&#65533;(&#65533;name攲tj攲age擪u.&#65533;&#65533;%    }&#65533;(&#65533;name攲tj攲age擪&#65533;sex攲濂硵u.

f = open("test2.txt","rb")
data = pickle.loads(f.read()) # 第一次反序列化正常
# data = pickle.loads(f.read()) # 第二次反序列化:EOFError: Ran out of input
print(data)
print(data["age"])
# print(data["sex"]) # KeyError: 'sex'

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI