<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python中JSON結(jié)構(gòu)數(shù)據(jù)的高效增刪改操作

          共 3237字,需瀏覽 7分鐘

           ·

          2021-08-11 02:19

          添加微信號"CNFeffery"加入技術(shù)交流群

          ?

          本文示例代碼及文件已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

          ?

          1 簡介

          在上一期文章中我們一起學(xué)習(xí)了在Python中如何使用jsonpath庫,對JSON格式數(shù)據(jù)結(jié)構(gòu)進行常規(guī)的節(jié)點條件查詢,可以滿足日常許多的數(shù)據(jù)處理需求。

          而在上一期結(jié)尾處,我提到了還有其他JSONPath功能相關(guān)的進階Python庫,在今天的文章中,我就將帶大家學(xué)習(xí)更加高級的JSON數(shù)據(jù)處理方式。

          2 基于jsonpath-ng的進階JSON數(shù)據(jù)處理方法

          jsonpath-ng是一個功能強大的Python庫,它整合了jsonpath-rw、jsonpath-rw-ext等第三方JSONPath拓展庫的實用功能,使得我們可以基于JSONPath語法,實現(xiàn)更多操縱JSON數(shù)據(jù)的功能,而不只是查詢數(shù)據(jù)而已,使用pip install jsonpath-ng進行安裝:

          2.1 JSON數(shù)據(jù)的增刪改

          jsonpath-ng中設(shè)計了一些方法,可以幫助我們實現(xiàn)對現(xiàn)有JSON數(shù)據(jù)的增刪改操作,首先我們來學(xué)習(xí)jsonpath-ng中如何定義JSONPath模式,并將其運用到對數(shù)據(jù)的匹配上,依然以上篇文章的數(shù)據(jù)為例:

          import json
          from jsonpath_ng import parse

          # 讀入示例json數(shù)據(jù)
          with open('json示例.json', encoding='utf-8'as j:
              demo_json = json.loads(j.read())
              
          # 構(gòu)造指定JSONPath模式對應(yīng)的解析器
          parser = parse('$..paths..steps[*].duration')

          # 利用解析器的find方法找到目標數(shù)據(jù)中所有滿足條件的節(jié)點
          matches = parser.find(demo_json)

          # 利用value屬性取得對應(yīng)匹配結(jié)果的值
          matches[0].value

          而基于上面產(chǎn)生的一些對象我們就可以實現(xiàn)對JSON數(shù)據(jù)的增刪改:

          2.1.1 對JSON數(shù)據(jù)進行增操作

          jsonpath-ng中對JSON數(shù)據(jù)添加節(jié)點,思想是先構(gòu)造對「原先不存在」的節(jié)點進行匹配的解析器對象,利用find_or_create方法處理原始JSON數(shù)據(jù):

          # 構(gòu)造示例數(shù)據(jù)
          demo_json = {
              'level1': [
                  {
                      'level2': {}
                  },
                  {
                      'level2': {
                          'level3'12
                      }
                  }
              ]
          }

          # 構(gòu)造規(guī)則解釋器,所有除去最后一層節(jié)點規(guī)則外可以匹配到的節(jié)點
          # 都屬于合法匹配結(jié)果,會在匹配結(jié)果列表中出現(xiàn)
          parser = parse('level1[*].level2.level3')

          matches = parser.find_or_create(demo_json)

          demo_json

          find_or_create操作之后,demo_json就被修改成下面的結(jié)果:

          接下來的事情就很簡單了,只需要在matches結(jié)果中進行遍歷,遇到value屬性為{}的,就運用full_path.update_or_create()方法對原始JSON數(shù)據(jù)進行更新即可,比如這里我們填充999:

          for match in matches:
              if match.value == {}:
                  # 更新原始輸入的JSON數(shù)據(jù)
                  match.full_path.update_or_create(demo_json, 999)

          demo_json

          2.1.2  對JSON數(shù)據(jù)進行刪操作

          當我們希望對JSON數(shù)據(jù)中指定JSONPath規(guī)則的節(jié)點予以刪除時,可以使用到parse對象的filter()方法傳入lambda函數(shù),在lambda函數(shù)中進行條件判斷,返回的即為刪除指定節(jié)點之后的輸入數(shù)據(jù)。

          以上一步「增」操作后得到的demo_json為例,我們來對其level1[*].level2.level3值為999的予以過濾:

          parser = parse('level1[*].level2.level3')

          # 過濾 level1[*].level2.level3 規(guī)則下值為 999 的節(jié)點
          parser.filter(lambda x: x == 999, demo_json)
          demo_json

          可以看到結(jié)果正是我們所預(yù)期的:

          2.1.3 對JSON數(shù)據(jù)進行改操作

          JSON數(shù)據(jù)中的指定節(jié)點進行改操作非常的簡單,只需要使用parse對象的updateupdate_or_create方法即可,使用效果的區(qū)別如下所示,輕輕松松就可以完成兩種策略下的節(jié)點更新操作??:

          jsonpath-ng中還有一些豐富的功能,這里就不再贅述,感興趣的讀者朋友可以前往https://github.com/h2non/jsonpath-ng查看。


          以上就是本文的全部內(nèi)容,歡迎在評論區(qū)與我進行討論~


          加入知識星球【我們談?wù)摂?shù)據(jù)科學(xué)】

          400+小伙伴一起學(xué)習(xí)!








          · 推薦閱讀 ·

          在Python中操縱json數(shù)據(jù)的最佳方式

          Python Dash 一個可以玩轉(zhuǎn)AI的可視化利器

          使用Python輕松獲取股票&基金數(shù)據(jù)


          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美色图日韩精品在线一区 | 日韩一级无码黄色电影 | 精品黄色视频 | 三级片91久久精品欧美亚洲三级片 | 女人完整毛片大全免费看 |