欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1641 0

在程序運行的過程中,所有的變量都是在內存中,比如定義一個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函數就可以實現對象字典的文件存取


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品免费观看 | 欧美日韩免费在线观看视频 | 538亚洲欧美国产日韩在线精品 | 色偷偷偷 | 免费一区二区三区 | 日韩精品在线一区 | 成人精品久久 | 国内精品视频在线观看 | 成人午夜毛片 | 91中文字幕| 国产成人福利 | 高清在线不卡 | 高清男女性高爱潮免费 | 特黄特色大片免费高清视频 | 玖玖在线免费视频 | 天天干天天操天天爽 | 日韩精品视频免费观看 | 亚洲国产精品无码观看久久 | 久草精品免费 | 国产精品久久久久久无遮挡 | 久久午夜电影网 | 亚洲日韩色图 | 日韩欧美精品 | 一区二区免费 | www.天堂av.com | 成人黄色网战 | 亚洲精品无码不卡在线播放he | 综合久久久久综合 | 中文精品久久 | 玖玖操| 日本黄色大片免费看 | www.黄色网.com | 99精品在线观看 | 毛片基地免费视频a | 久久久精品| 91免费大片| 特级欧美视频aaaaaa | 色久在线 | 亚洲毛片无码专区亚洲A片 日本高清www午色夜黄 | 欧美日韩视频 | 成人一级视频 |