在程序運行的過程中,所有的變量都是在內(nèi)存中,比如定義一個dict1 = {“name”:“zhangsan”,“age”:20},我們對name屬性進(jìn)行修改,改"wangwu",但是一旦程序結(jié)束,變量所占用的內(nèi)存就會被操作系統(tǒng)全部回收,如果沒有把修改后的name存儲到磁盤上,下次重新運行程序,屬性name又會被初始化為"zhangsan"。
這時候就會使用到序列化與反序列化,將序列化后的內(nèi)容寫入磁盤,這里會講到pickle模塊與json模塊去實現(xiàn)序列化與反序列化。
序列化與反序列化
在Python中,我們將變量從內(nèi)存中變成可存儲或者是可傳輸?shù)倪@個過程我們稱之為序列化,即pickling
反過來,把變量內(nèi)容從序列化的對象重新讀到內(nèi)存里稱之為反序列化,即unpickling
例如:將字典存到demo.txt文件中,再從demo.txt文件中將字典重新讀取出來
首先實現(xiàn)將字典存到文件中,代碼如下:
def
writeFile
(
dict1
)
:
with
open
(
"demo.txt"
,
"w"
,
encoding
=
"utf-8"
)
as
f
:
f
.
write
(
str
(
dict1
)
)
將字典從文件重新讀取出來,代碼如下:
def
readFile
(
)
:
with
open
(
"demo.txt"
,
"r"
,
encoding
=
"utf-8"
)
as
f
:
return
eval
(
f
.
read
(
)
)
再調(diào)用writeFile函數(shù)和readFile函數(shù)就可以實現(xiàn)字典從文件讀取與存入:
if
__name__
==
'__main__'
:
dict1
=
{
"name"
:
"韓梅梅"
,
"age"
:
19
}
writeFile
(
dict1
)
dict2
=
readFile
(
)
print
(
dict2
)
pickle模塊
pickle模塊可以將任意的對象序列化成二進(jìn)制的字符串寫入到文件中。還可以從文件中讀取并且轉(zhuǎn)為寫入時候類型。
現(xiàn)有如下這樣一個Card類,我們想要將由Card對象組成的列表存到文件中,并且從文件中將其讀取出來,該怎樣去實現(xiàn)呢?
class
Card
:
def
__init__
(
self
,
cardnum
,
password
,
money
,
lock
=
False
)
:
self
.
cardnum
=
cardnum
self
.
password
=
password
self
.
money
=
money
self
.
lock
=
lock
這里我們可以用pickle模塊去實現(xiàn)對象的序列化以及反序列化,下面將會講到pickle模塊中會用到的幾個函數(shù)
要使用到pickle模塊,我們就要先導(dǎo)入pickle模塊
import
pickle
1. pickle.dumps(obj)和pickle.dump(obj,file)
pickle.dumps(obj)函數(shù)的功能是將obj對象進(jìn)行序列化
def
writeFile
(
path
,
cardlist
)
:
with
open
(
path
,
"wb"
)
as
f
:
f
.
write
(
pickle
.
dumps
(
cardlist
)
)
pickle.dump(obj,file)函數(shù)的功能是將obj對象序列化并且存入到打開的文件中
def
writeFile
(
path
,
cardlist
)
:
with
open
(
path
,
"wb"
)
as
f
:
pickle
.
dump
(
cardlist
,
f
)
2. pickle.loads(bytes)和pickle.load(file)
pickle.loads(bytes)函數(shù)的功能是將二進(jìn)制的字符串轉(zhuǎn)為對象
def
readFile
(
path
)
:
with
open
(
path
,
"rb"
)
as
f
:
return
pickle
.
loads
(
f
.
read
(
)
)
pickle.load(file)函數(shù)的功能是將文件中的內(nèi)容讀取并且轉(zhuǎn)為對象
def
readFile
(
path
)
:
with
open
(
path
,
"rb"
)
as
f
:
return
pickle
.
load
(
f
)
在上面我們已經(jīng)完成了列表的文件存取函數(shù),現(xiàn)在只要調(diào)用writeFile函數(shù)和readFile函數(shù)就可以了
if
__name__
==
'__main__'
:
card1
=
Card
(
"101111"
,
"111"
,
100
)
card2
=
Card
(
"101112"
,
"222"
,
1000
)
card3
=
Card
(
"101113"
,
"333"
,
10000
)
cardlist
=
[
card1
,
card2
,
card3
]
path
=
"pickledemo.txt"
writeFile
(
path
,
cardlist
)
cardlist1
=
readFile
(
path
)
for
card
in
cardlist1
:
print
(
"cardnum: %s\npassword: %s\nmoney: %d"
%
(
card
.
cardnum
,
card
.
password
,
card
.
money
)
)
json模塊
json模塊提供的方法,可以直接將python基本數(shù)據(jù)類型序列化為json字符串。也可以將json字符串轉(zhuǎn)為python的基本數(shù)據(jù)類型。
還是以上面的例子為例,現(xiàn)在要將有Card對象組成的字典存到文件中,并且從文件中將其讀取出來
要使用到j(luò)son模塊,也要先導(dǎo)入json模塊
import
json
1. json.dumps(obj,default)
obj:被序列化的對象
default:將對象轉(zhuǎn)為字典的函數(shù)
功能:將對象序列化為json字符串
首先我們需要一個可以將Card對象轉(zhuǎn)化為字典的函數(shù),將其傳遞到default參數(shù)中
def
obj2dict
(
card
)
:
return
{
"cardnum"
:
card
.
cardnum
,
"password"
:
card
.
password
,
"money"
:
card
.
money
,
"lock"
:
card
.
lock
}
將字典存到文件中
def
writeFile
(
path
,
carddict
)
:
with
open
(
path
,
"w"
,
encoding
=
"utf-8"
)
as
fp
:
for
card
in
carddict
.
values
(
)
:
jstr
=
json
.
dumps
(
card
,
default
=
obj2dict
)
fp
.
write
(
jstr
+
'\n'
)
2. json.dump(obj,file,default)
obj:被序列化的對象
file:打開的文件對象
default:將對象轉(zhuǎn)為字典的函數(shù)
功能:將對象序列化為json字符串并且寫入到打開的文件對象中
def
writeFile
(
path
,
carddict
)
:
with
open
(
path
,
"w"
,
encoding
=
"utf-8"
)
as
fp
:
json
.
dump
(
carddict
,
fp
,
default
=
obj2dict
)
3. json.loads(jsonstr,object_hook)
jsonstr:json字符串
object_hook:將字典轉(zhuǎn)為對象的函數(shù)
功能:將字符串反序列化成對象
這里需要一個可以將字典轉(zhuǎn)化為Card對象的函數(shù),將其傳遞到object_hook參數(shù)中
def
dict2obj
(
dict1
)
:
return
Card
(
dict1
[
"cardnum"
]
,
dict1
[
"password"
]
,
dict1
[
"money"
]
,
dict1
[
"lock"
]
)
從文件中讀取數(shù)據(jù)
def
readFile
(
path
)
:
with
open
(
path
,
"r"
,
encoding
=
"utf-8"
)
as
fp
:
carddict
=
{
}
for
jstr
in
fp
.
readlines
(
)
:
card
=
json
.
loads
(
jstr
,
object_hook
=
dict2obj
)
carddict
[
card
.
cardnum
]
=
card
return
carddict
4. json.load(fp,object_hook)
fp:打開的文件對象
object_hook:將字典轉(zhuǎn)為對象的函數(shù)
功能:將打開的文件對象的內(nèi)容讀取并且反序列化成對象
def
readFile
(
path
)
:
with
open
(
path
,
"r"
,
encoding
=
"utf-8"
)
as
fp
:
carddict
=
json
.
load
(
fp
)
return
carddict
最后只要調(diào)用writeFile函數(shù)和readFile函數(shù)就可以實現(xiàn)對象字典的文件存取
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
