亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python之序列化與反序列化(pickle模塊與json模塊)

系統(tǒng) 1552 0

在程序運行的過程中,所有的變量都是在內(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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米影视四色7777 | 亚洲欧美日韩国产精品网 | 久久免费国产精品一区二区 | 午夜官网| 国产中文欧美 | 亚洲精品成人7777在线观看 | 亚洲免费一区 | 色偷偷青青草原在线视频 | 亚洲精品第一国产麻豆 | 亚洲国产最新 | 欧美福利精品福利视频在线观看 | 免费亚洲成人 | 成人18免费网站 | 欧美精彩狠狠色丁香婷婷 | 欧美一欧美一级毛片 | 国产精品成人免费观看 | 日日噜噜噜夜夜爽爽狠狠 | 99精品国产成人一区二区在线 | 色老头xxxxbbbb视频 | 五月天婷婷免费视频 | 美女被a到爽视频在线观看 美女被cao的视频免费看 | 就操成人网| 亚洲精品国产成人一区二区 | 国产综合色在线视频区色吧图片 | 国内精品自在自线在免费 | 欧美中文字幕在线观看 | 最近中文字幕免费版在线3 最近中文字幕无吗高清视频 | 国产精品夜色7777青苹果 | 九九热在线视频观看这里只有精品 | 亚洲成人毛片 | 精品国产成人三级在线观看 | 日韩欧美中文字幕在线观看 | 这里只有精品视频在线观看 | 四虎午夜影院 | 欧美洲精品亚洲精品中文字幕 | 欧美一区精品二区三区 | 日韩xx00| 91国内视频| 久久国产高清一区二区三区 | 国产主播第一页 | 欧美日韩国产成人综合在线影院 |