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

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條評論
主站蜘蛛池模板: 伊人色网站| 欧美一区二区三区久久久 | 色婷婷激婷婷深爱五月小蛇 | 亚洲h在线观看 | 夜色资源在线观看免费 | 成人国产精品免费视频 | 国产爆操 | jizzjizz美女 | 免费看日韩欧美一级毛片 | 久久99精品这里精品3 | 香蕉免费一区二区三区在线观看 | 97午夜影院| 久久99精品久久 | 国产成人视屏 | 国产一级毛片一区二区三区 | 成人小视频在线观看 | 久草免费资源视频 | 国产成人精品午夜二三区 | 亚洲精品一区二区三区不卡 | 一级成人毛片 | 免费看片黄 | 久久99热只有视精品6国产 | 日本大片免a费观看在线 | 天天怕夜夜怕狠狠怕 | 国产成人在线视频免费观看 | 视频日韩| 91在线观 | 久久免费看 | 图片专区亚洲欧美另类 | 日本午夜大片a在线观看 | 国国产自国偷自产第38页 | 另类 欧美 视频二区 | 国产精品自拍视频 | 九九久久九九久久 | 国产精品原创永久在线观看 | 国产视频久久 | 夜夜操操操 | 九九99香蕉在线视频美国毛片 | 日日噜噜噜夜夜爽爽狠狠图片 | 亚洲日本久久久午夜精品 | 国产欧美一区二区精品久久久 |