<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數(shù)據(jù)的最佳方式

          共 2742字,需瀏覽 6分鐘

           ·

          2021-08-19 23:00

          ?

          本文示例代碼及文件已上傳至我的Github倉(cāng)庫(kù)https://github.com/CNFeffery/DataScienceStudyNotes

          ?

          1 簡(jiǎn)介

          在日常使用Python的過(guò)程中,我們經(jīng)常會(huì)與json格式的數(shù)據(jù)打交道,尤其是那種嵌套結(jié)構(gòu)復(fù)雜的json數(shù)據(jù),從中抽取復(fù)雜結(jié)構(gòu)下鍵值對(duì)數(shù)據(jù)的過(guò)程枯燥且費(fèi)事。

          而熟悉xpath的朋友都知道,對(duì)于xml格式類型的具有層次結(jié)構(gòu)的數(shù)據(jù),我們可以通過(guò)編寫xpath語(yǔ)句來(lái)靈活地提取出滿足某些結(jié)構(gòu)規(guī)則的數(shù)據(jù)。

          類似的,JSONPath也是用于從json數(shù)據(jù)中按照層次規(guī)則抽取數(shù)據(jù)的一種實(shí)用工具,在Python中我們可以使用jsonpath這個(gè)庫(kù)來(lái)實(shí)現(xiàn)JSONPath的功能。

          2 在Python中使用JSONPath提取json數(shù)據(jù)

          jsonpath是一個(gè)第三方庫(kù),所以我們首先需要通過(guò)pip install jsonpath對(duì)其進(jìn)行安裝。

          2.1 一個(gè)簡(jiǎn)單的例子

          安裝完成后,我們首先來(lái)看一個(gè)簡(jiǎn)單的例子,從而初探其使用方式:

          這里使用到的示例json數(shù)據(jù)來(lái)自高德地圖步行導(dǎo)航接口,包含了從天安門廣場(chǎng)到西單大悅城的步行導(dǎo)航結(jié)果,原始數(shù)據(jù)如下,層次結(jié)構(gòu)較深:

          假如我想要獲取其嵌套結(jié)構(gòu)中steps鍵值對(duì)下每段行程的耗時(shí)duration數(shù)據(jù),配合jsonpath就可以這樣做:

          import json
          from jsonpath import jsonpath

          # 讀入示例json數(shù)據(jù)
          with open('json示例.json', encoding='utf-8'as j:
              demo_json = json.loads(j.read())

          # 配合JSONPath表達(dá)式提取數(shù)據(jù)
          jsonpath(demo_json, '$..steps[*].duration')

          其中$..steps[*].duration就是我們用于描述數(shù)據(jù)位置規(guī)則的JSONPath語(yǔ)句,配合jsonpath()便可以提取出對(duì)應(yīng)信息,下面我們就來(lái)學(xué)習(xí)jsonpath中支持的常用JSONPath語(yǔ)法:

          2.2 jsonpath中的常用JSONPath語(yǔ)法

          為了滿足日常提取數(shù)據(jù)的需求,JSONPath中設(shè)計(jì)了一系列語(yǔ)法規(guī)則來(lái)實(shí)現(xiàn)對(duì)目標(biāo)值的定位,其中常用的有:

          • 「按位置選擇節(jié)點(diǎn)」

          jsonpath中主要有以下幾種按位置選擇節(jié)點(diǎn)的方式:

          功能語(yǔ)法
          根節(jié)點(diǎn)$
          當(dāng)前節(jié)點(diǎn)@
          子節(jié)點(diǎn).或[]
          任意子節(jié)點(diǎn)*
          任意后代節(jié)點(diǎn)..

          讓我們來(lái)演示一下它們的一些用法:

          # 提取所有duration鍵對(duì)應(yīng)值
          jsonpath(demo_json, '$..duration')
          # 提取所有steps鍵的子節(jié)點(diǎn)對(duì)應(yīng)instruction值
          jsonpath(demo_json, '$..steps.*.instruction')
          • 「索引子節(jié)點(diǎn)」

          有些時(shí)候我們需要在選擇過(guò)程中對(duì)子節(jié)點(diǎn)做多選或按位置選擇操作,就可以使用到jsonpath中的相關(guān)功能:

          # 多選所有steps鍵的子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值
          jsonpath(demo_json, '$..steps.*[instruction,action]')
          # 選擇steps鍵的第0個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值
          jsonpath(demo_json, '$..steps[0][instruction,action]')

          # 選擇steps鍵的第1到3(不包括3)個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值
          jsonpath(demo_json, '$..steps[1:3][instruction,action]')

          # 配合@,選擇steps鍵的最后一個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值
          jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')
          • 「條件篩選」

          有些時(shí)候我們需要根據(jù)子節(jié)點(diǎn)的某些鍵值對(duì)值,對(duì)選擇的節(jié)點(diǎn)進(jìn)行篩選,在jsonpath中支持常用的==、!=>、<等比較運(yùn)算符,以==比較符為例,這里配合@定位符從當(dāng)前節(jié)點(diǎn)提取子節(jié)點(diǎn),語(yǔ)法為?(@.鍵名 比較符 值)

          # 找到所有steps子節(jié)點(diǎn)中orientation為“西”的
          jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')

          而如果想要提取所有具有指定鍵的節(jié)點(diǎn),可以參考下面的例子:

          # 找到所有具有polyline鍵的節(jié)點(diǎn)對(duì)應(yīng)的polyline與road鍵對(duì)應(yīng)值
          jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')

          2.3 返回結(jié)果的形式

          在前面的例子中,我們所有的返回結(jié)果直接就是提取到的滿足條件的結(jié)果,而jsonpath()中還提供了另一種特殊的結(jié)果返回形式,只需要設(shè)置參數(shù)result_type=None就可以改直接返回結(jié)果為返回每個(gè)結(jié)果的JSONPath表達(dá)式:

          # 獲取結(jié)果的JSONPath表達(dá)式
          jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)

          以上介紹的均為jsonpath庫(kù)中的常規(guī)功能,可以滿足基礎(chǔ)的json數(shù)據(jù)提取需求,而除了jsonpath之外,還有其他具有更加豐富拓展功能的JSONPath類的第三方庫(kù),可以幫助我們實(shí)現(xiàn)很多進(jìn)階靈活的操作,我們將在下一篇文章中繼續(xù)討論。


          以上就是本文的全部?jī)?nèi)容,歡迎在評(píng)論區(qū)與我進(jìn)行討論~

          推薦閱讀


          Pandas處理數(shù)據(jù)太慢,來(lái)試試Polars吧!
          懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫(kù)
          絕!關(guān)于pip的15個(gè)使用小技巧
          介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
          可能是全網(wǎng)最完整的 Python 操作 Excel庫(kù)總結(jié)!

          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  中国在线黄色一级学生妹 | 五月天色婷婷婷 | 欧美成人精品激情在线观看 | 操操操操操| 青娱乐亚洲高清视频 |