乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python數(shù)據(jù)持久化:JSON| 編程派 | Coding Python

       書*金 2017-03-20

      上周更新的《Think Python 2e》第14章講述了幾種數(shù)據(jù)持久化的方式,包括dbm、pickle等,但是考慮到篇幅和讀者等因素,并沒(méi)有將各種方式都列全。

      本文將介紹一個(gè)與pickle類似的輕量級(jí)數(shù)據(jù)持久化方式,即json。而且json也是在網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)囊环N常見格式,非常有了解和學(xué)習(xí)的必要。 ?

      JSON與Pickle的區(qū)別

      Python官方文檔中是這么比較JSON與Pickle的:

      1. JSON是文本形式的存儲(chǔ),Pickle則是二進(jìn)制形式(至少常用二進(jìn)制)
      2. JSON是人可讀的,Pickle不可讀
      3. JSON廣泛應(yīng)用于除Python外的其他領(lǐng)域,Pickle是Python獨(dú)有的
      4. JSON只能dump一些python的內(nèi)置對(duì)象,Pickle可以存儲(chǔ)幾乎所有對(duì)象

      JSON一般使用方式

      Python中處理json的自帶庫(kù)就是json模塊,需要用到的方法大致就是以下4個(gè),其實(shí)它們的參數(shù)有很多這里暫且省略。

      import json
      obj = {'a' : 'b', 'c' : 'd'}
      fp = open('obj.json', 'w')
      json.dump(obj, fp)
      fp.close()s = json.dumps(obj)
      x = json.load(open('obj.json', 'r'))
      y = json.loads(s)
      

      可以看到,結(jié)尾帶s就是在字符串層面上操作,如果不帶s就是在文件層級(jí)操作。obj指的是需要轉(zhuǎn)化的對(duì)象,可以是一個(gè)字典或者列表,fp是文件句柄,用open打開。s則是一個(gè)字符串。

      dumps返回的是一個(gè)字符串,load和loads則會(huì)返回python的對(duì)象。

      以上是最簡(jiǎn)單的一些使用方式,這里還有一些實(shí)用的參數(shù)可以選擇。

      import json
      obj = {u'姓名' : u'無(wú)名氏', u'國(guó)籍' : u'中國(guó)'}
      s = json.dumps(obj, ensure_ascii=False, indent=4)
      obj2 = json.loads(s, encoding='utf8')
      

      ensure_ascii參數(shù),是在有中文的情況下,設(shè)置為False可以防止將其解碼而得到亂碼,在loads的時(shí)候可以指定encoding來(lái)保持編碼。

      中文編碼問(wèn)題請(qǐng)參考之前發(fā)的文章:《如何正確解決Python中的中文編碼問(wèn)題》。

      indent參數(shù)如果不指定的話,輸出的字符串就是緊湊的形式,indent指定為4就可以輸出縮進(jìn)為4的美化形式,在需要給人看的時(shí)候用這個(gè)不錯(cuò)。

      JSON序列化datetime問(wèn)題

      Python自己的json.dumps不能序列化datetime對(duì)象,如果需要dump這類對(duì)象時(shí)可以自己定義JSONEncoder。

      import json
      from datetime import date, datetime
      class AdvEncoder(json.JSONEncoder):
          def default(self, obj):
              if isinstance(obj, datetime):
                  return obj.strftime('%Y-%m-%d %H:%M:%S')
              elif isinstance(obj, date):
                  return obj.strftime('%Y-%m-%d')
              else:
                  return super().default(self, obj)
      
      obj = {}
      json.dumps(obj, cls=AdvEncoder)
      

      這樣在dump時(shí)指定cls參數(shù)就可以完成序列化datetime的任務(wù)了,如果覺(jué)得麻煩的話,可以使用偏函數(shù)的方法自己封裝一下。

      import functools
      adumps = functools.partial(json.dumps, cls=AdvEncoder)
      d = datetime.now()
      adumps(d)
      

      simplejson

      Python中自帶的json庫(kù)是在2.6版本中才加入的。因此,如果你需要使用一個(gè)更早的Python版本并且處理json數(shù)據(jù),那么你可以安裝一個(gè)第三方庫(kù):simplejson。

      simplejson模擬了自帶的json庫(kù),目前支持Python 2.5+和Python 3.3+。根據(jù)官方文檔的介紹,該庫(kù)在沒(méi)有安裝C擴(kuò)展的情況下,速度仍優(yōu)于自帶的json庫(kù)。這應(yīng)該也是為什么simplejson在PyPI的下載數(shù)超高的原因之一。

      要使用simplejson,你只需要像下面這樣導(dǎo)入即可:

      import simplejson as json
      

      其他的代碼不需要修改。

      參考資料

      Python Data Persistence

      本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或編譯,如需轉(zhuǎn)載,請(qǐng)聯(lián)系微信公眾號(hào)“編程派”獲得授權(quán)。轉(zhuǎn)載時(shí),應(yīng)注明來(lái)源、作者及原文鏈接。

      上一篇
      下一篇

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多