日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中的序列化与反序列化_Python之序列化与反序列化(pickle模块与json模块)...

發布時間:2023/12/16 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的序列化与反序列化_Python之序列化与反序列化(pickle模块与json模块)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在程序運行的過程中,所有的變量都是在內存中,比如定義一個dict1 = {“name”:“zhangsan”,“age”:20},我們對name屬性進行修改,改"wangwu",但是一旦程序結束,變量所占用的內存就會被操作系統全部回收,如果沒有把修改后的name存儲到磁盤上,下次重新運行程序,屬性name又會被初始化為"zhangsan"。

這時候就會使用到序列化與反序列化,將序列化后的內容寫入磁盤,這里會講到pickle模塊與json模塊去實現序列化與反序列化。

序列化與反序列化

在Python中,我們將變量從內存中變成可存儲或者是可傳輸的這個過程我們稱之為序列化,即pickling

反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling

例如:將字典存到demo.txt文件中,再從demo.txt文件中將字典重新讀取出來

首先實現將字典存到文件中,代碼如下:

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

(

)

)

再調用writeFile函數和readFile函數就可以實現字典從文件讀取與存入:

if

__name__

==

'__main__'

:

dict1

=

{

"name"

:

"韓梅梅"

,

"age"

:

19

}

writeFile

(

dict1

)

dict2

=

readFile

(

)

print

(

dict2

)

pickle模塊

pickle模塊可以將任意的對象序列化成二進制的字符串寫入到文件中。還可以從文件中讀取并且轉為寫入時候類型。

現有如下這樣一個Card類,我們想要將由Card對象組成的列表存到文件中,并且從文件中將其讀取出來,該怎樣去實現呢?

class

Card

:

def

__init__

(

self

,

cardnum

,

password

,

money

,

lock

=

False

)

:

self

.

cardnum

=

cardnum

self

.

password

=

password

self

.

money

=

money

self

.

lock

=

lock

這里我們可以用pickle模塊去實現對象的序列化以及反序列化,下面將會講到pickle模塊中會用到的幾個函數

要使用到pickle模塊,我們就要先導入pickle模塊

import

pickle

1. pickle.dumps(obj)和pickle.dump(obj,file)

pickle.dumps(obj)函數的功能是將obj對象進行序列化

def

writeFile

(

path

,

cardlist

)

:

with

open

(

path

,

"wb"

)

as

f

:

f

.

write

(

pickle

.

dumps

(

cardlist

)

)

pickle.dump(obj,file)函數的功能是將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)函數的功能是將二進制的字符串轉為對象

def

readFile

(

path

)

:

with

open

(

path

,

"rb"

)

as

f

:

return

pickle

.

loads

(

f

.

read

(

)

)

pickle.load(file)函數的功能是將文件中的內容讀取并且轉為對象

def

readFile

(

path

)

:

with

open

(

path

,

"rb"

)

as

f

:

return

pickle

.

load

(

f

)

在上面我們已經完成了列表的文件存取函數,現在只要調用writeFile函數和readFile函數就可以了

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基本數據類型序列化為json字符串。也可以將json字符串轉為python的基本數據類型。

還是以上面的例子為例,現在要將有Card對象組成的字典存到文件中,并且從文件中將其讀取出來

要使用到json模塊,也要先導入json模塊

import

json

1. json.dumps(obj,default)

obj:被序列化的對象

default:將對象轉為字典的函數

功能:將對象序列化為json字符串

首先我們需要一個可以將Card對象轉化為字典的函數,將其傳遞到default參數中

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:將對象轉為字典的函數

功能:將對象序列化為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:將字典轉為對象的函數

功能:將字符串反序列化成對象

這里需要一個可以將字典轉化為Card對象的函數,將其傳遞到object_hook參數中

def

dict2obj

(

dict1

)

:

return

Card

(

dict1

[

"cardnum"

]

,

dict1

[

"password"

]

,

dict1

[

"money"

]

,

dict1

[

"lock"

]

)

從文件中讀取數據

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:將字典轉為對象的函數

功能:將打開的文件對象的內容讀取并且反序列化成對象

def

readFile

(

path

)

:

with

open

(

path

,

"r"

,

encoding

=

"utf-8"

)

as

fp

:

carddict

=

json

.

load

(

fp

)

return

carddict

最后只要調用writeFile函數和readFile函數就可以實現對象字典的文件存取

總結

以上是生活随笔為你收集整理的python中的序列化与反序列化_Python之序列化与反序列化(pickle模块与json模块)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。