黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統 1910 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條評論