<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在本文中,我們將學習如何使用Python讀取、解析和編寫JSON檔案。
我們將討論如何最好地處理簡單的JSON檔案以及巢狀的JSON檔案,當然我們也將討論如何存取Json檔案資料中的特定值。
JSON(Java Script Object Notation)是一種流行的檔案格式,主要用於在web應用程式中儲存和傳輸資料。如果我們經常和資料打交道,那麼一定或多或少遇到過JSON格式的檔案,因此我們有必要來學習如何讀取和寫入JSON。
下圖為常見的JSON檔案結構的範例.
JSON結構看起來和Python中的字典非常類似。需要注意的是,JSON格式通常是由key: 結對組成,其中key是字串形式,value是字串、數位、布林值、陣列、物件或null。
為了更直觀的進行說明,在下圖中我們以藍色突出顯示了所有的key,同時以橙色突出顯示了所有的value。請注意,以下每組key/value間均使用逗號進行區分。
在Python中內建了用於讀取JSON檔案的函數。以下給出幾個如何將JSON檔案解析為Python物件的範例。
首先我們需要匯入 json庫, 接著我們使用open函數來讀取JSON檔案,最後利用json.load()函數將JSON字串轉化為Python字典形式.
就這麼簡單,程式碼如下:
import json with open('superheroes.json') as f: superHeroSquad = json.load(f) print(type(superHeroSquad)) # Output: dict print(superHeroSquad.keys()) # Output: dict_keys(['squadName', 'homeTown', 'formed', 'secretBase', 'active', 'members'])
上述程式碼很簡單很直觀啦,唯一需要注意的是json庫中有load()和loads()兩個函數.
函數load()作用為讀取JSON檔案生成Python物件函數loads()作用為讀取JSON 字串流生成Python物件
我們可以將loads()函數中的字元s的含義理解成 load for strings.
當然我們也可以使用Pandas庫中的 read_json函數來讀取對應的JSON檔案,
程式碼如下:
import pandas as pd df = pd.read_json('superheroes.json')
執行結果如下:
需要注意的是使用Pandas庫不僅僅可以讀取電腦本地磁碟上的JSON檔案,也可以通過URL讀取網路上存放的檔案.
程式碼如下:
df1 = pd.read_json('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json')
我們有時候遇到的JSON檔案是巢狀的,這經常會讓讀取工作變得有些困難. 其實巢狀JSON和Python中的巢狀字典思想類似,即字典中巢狀字典.
我們觀察上述例子中的member欄位,其值也為字典型別,下圖中我們使用縮排來展示巢狀結構。
設想一下,當我們將JSON檔案載入到Pandas資料框架中時,members列如下所示。每行包含一個字典。
接下來我們討論兩種實現方法,這兩種方法中,我們可以解析資料,以便將每個鍵分解為單獨的一列。
方案一
我們可以在members這一列上使用apply方法,程式碼如下:
df['members'].apply(pd.Series)
上述程式碼執行後,members列會被拆分為4個新列,如下所示:
當然如果你想將上述拆分後的結果和之前的結果進行合併,可以使用pd.concat函數,
程式碼如下:
df = pd.concat([df['members'].apply(pd.Series), df.drop('members', axis = 1)], axis = 1)
方案二
在Pandas庫中還有一個函數 json_normalize() ,它允許我們把巢狀的JSON展開。這是最簡單的方法來解析巢狀的JSON了。
程式碼如下:
def test2(): with open('superheroes.json') as f: superHeroSquad = json.load(f) out = pd.json_normalize(superHeroSquad, record_path=['members'], meta=['squadName', 'homeTown', 'formed', 'secretBase', 'active']) print(out)
上述程式碼中:
執行結果如下:
最後我們需要注意的是,我們可以在上述函數json_normalize中新增引數 meta_prefix,這樣可以讓我們對meta中的名字新增統一的字首。
程式碼如下:
pd.json_normalize(superHeroSquad, record_path = ['members'], meta = ['squadName', 'homeTown', 'formed', 'secretBase', 'active'], meta_prefix = 'members_')
運行結果如下:
在Python中我們可以通過Key的名字或者下標來存取JSON檔案中任意位置的資料。
比如,假設我們想知道我們的第二個超級英雄的祕密身份。即在下圖中,需要存取特定位置的資料在下圖中以紫色突出顯示。
為了得到這個值,我們可以直接使用以下語句:
superHeroSquad['members'][1]['secretIdentity']
從層次結構的頂部開始,由上往下,我們需要的第一個key是'members',因為它是我們需要存取的值所在的父節點。
在‘members'對應的鍵值中,我們看中括號,然後下標1表示list中的第二個成員。接著我們來看欄位'secretIdentity',如下所示:
將上述過程合併在一起,我們就可以得到我們特定位置出的值為'Jane Wilson'。
細心的同學可能已經注意到,我在上面的JSON片段中突出顯示了兩個藍色的值。希望感興趣的同學們可以作為練習來嘗試存取這些值。歡迎在文章後面的評論區中分享你的程式碼。
讓我們編輯一下我們最後一位超級英雄,將其secretIdentity從‘Unknow'更改為‘Will Smith',接著將這個字典匯出為JSON檔案。這裡我們將使用json.dump()函數將字典寫入檔案。
程式碼如下:
#update secret identity of Eternal Flame superHeroSquad['members'][2]['secretIdentity'] = 'Will Smith' with open('superheroes.json', 'w') as file: json.dump(superHeroSquad, file)
上述程式碼執行後,我們開啟檔案superheroes.json,可以發現最後一名超級英雄的secretIdentity已經由Unknow變為了Will Smith.
當然,作為選擇,我們也可以使用Pandas中的to_json()函數,完成上述功能。
df.to_json('superheroes.json')
我們有時候在終端直接列印json檔案,通常會得到很不美觀的輸出,樣例如下:
為了讓其看起來更加美觀,我們這裡可以在函數json.dump中採用引數indent引數來控制輸出格式,程式碼如下:
with open('superheroes.json', 'w') as file: json.dump(superHeroSquad, file, indent = 4)
結果輸出如下,是不是看上去更加美觀啦。。。
當然dump函數中含有欄位sort_key,通過設定其值,可以控制輸出時是否對key進行排序。需要注意所有的key包括巢狀的key都會進行排序。
樣例如下:
with open('superheroes.json', 'w') as file: json.dump(superHeroSquad, file, indent = 4, sort_keys = True)
執行結果如下:
最後,讓我們對本文做一下回顧,總結如下:
到此這篇關於Python中優雅處理JSON檔案的文章就介紹到這了,更多相關Python優雅處理JSON檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45