最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中優(yōu)雅處理JSON文件的方法實(shí)例

 更新時(shí)間:2021年12月21日 11:28:28   作者:趙卓不凡  
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣,這篇文章主要給大家介紹了關(guān)于Python中優(yōu)雅處理JSON文件的相關(guān)資料,需要的朋友可以參考下

1. 引言

在本文中,我們將學(xué)習(xí)如何使用Python讀取、解析和編寫JSON文件。
我們將討論如何最好地處理簡(jiǎn)單的JSON文件以及嵌套的JSON文件,當(dāng)然我們也將討論如何訪問Json文件數(shù)據(jù)中的特定值。

2. 什么是JSON文件?

JSON(Java Script Object Notation)是一種流行的文件格式,主要用于在web應(yīng)用程序中存儲(chǔ)和傳輸數(shù)據(jù)。如果我們經(jīng)常和數(shù)據(jù)打交道,那么一定或多或少遇到過JSON格式的文件,因此我們有必要來學(xué)習(xí)如何讀取和寫入JSON。

下圖為常見的JSON文件結(jié)構(gòu)的示例.

JSON結(jié)構(gòu)看起來和Python中的字典非常類似。需要注意的是,JSON格式通常是由key: 結(jié)對(duì)組成,其中key是字符串形式,value是字符串、數(shù)字、布爾值、數(shù)組、對(duì)象或null。

為了更直觀的進(jìn)行說明,在下圖中我們以藍(lán)色突出顯示了所有的key,同時(shí)以橙色突出顯示了所有的value。請(qǐng)注意,以下每組key/value間均使用逗號(hào)進(jìn)行區(qū)分。

3. 使用Python處理JSON文件

在Python中內(nèi)置了用于讀取JSON文件的函數(shù)。以下給出幾個(gè)如何將JSON文件解析為Python對(duì)象的示例。

3.1. 將JSON文件讀取為字典類型

首先我們需要導(dǎo)入 json庫, 接著我們使用open函數(shù)來讀取JSON文件,最后利用json.load()函數(shù)將JSON字符串轉(zhuǎn)化為Python字典形式.

就這么簡(jiǎn)單,代碼如下:

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'])

上述代碼很簡(jiǎn)單很直觀啦,唯一需要注意的是json庫中有l(wèi)oad()和loads()兩個(gè)函數(shù).

函數(shù)load()作用為讀取JSON文件生成Python對(duì)象函數(shù)loads()作用為讀取JSON 字符串流生成Python對(duì)象

我們可以將loads()函數(shù)中的字符s的含義理解成 load for strings.

3.2. 將JSON文件讀取為Pandas類型

當(dāng)然我們也可以使用Pandas庫中的 read_json函數(shù)來讀取對(duì)應(yīng)的JSON文件,

代碼如下:

import pandas as pd
df = pd.read_json('superheroes.json')

運(yùn)行結(jié)果如下:

需要注意的是使用Pandas庫不僅僅可以讀取電腦本地磁盤上的JSON文件,也可以通過URL讀取網(wǎng)絡(luò)上存放的文件.

代碼如下:

df1 = pd.read_json('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json')

3.3. 使用Pandas讀取嵌套JSON類型

我們有時(shí)候遇到的JSON文件是嵌套的,這經(jīng)常會(huì)讓讀取工作變得有些困難. 其實(shí)嵌套JSON和Python中的嵌套字典思想類似,即字典中嵌套字典.

我們觀察上述例子中的member字段,其值也為字典類型,下圖中我們使用縮進(jìn)來展示嵌套結(jié)構(gòu)。

設(shè)想一下,當(dāng)我們將JSON文件加載到Pandas數(shù)據(jù)框架中時(shí),members列如下所示。每行包含一個(gè)字典。


接下來我們討論兩種實(shí)現(xiàn)方法,這兩種方法中,我們可以解析數(shù)據(jù),以便將每個(gè)鍵分解為單獨(dú)的一列。

方案一

我們可以在members這一列上使用apply方法,代碼如下:

df['members'].apply(pd.Series)

上述代碼執(zhí)行后,members列會(huì)被拆分為4個(gè)新列,如下所示:

當(dāng)然如果你想將上述拆分后的結(jié)果和之前的結(jié)果進(jìn)行合并,可以使用pd.concat函數(shù),

代碼如下:

df = pd.concat([df['members'].apply(pd.Series), df.drop('members', axis = 1)], axis = 1)

方案二

在Pandas庫中還有一個(gè)函數(shù) json_normalize() ,它允許我們把嵌套的JSON展開。這是最簡(jiǎn)單的方法來解析嵌套的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)

上述代碼中:

  • record_path為我們希望拆分的列的名字
  • meta為列名的list,為我們輸出的次序

運(yùn)行結(jié)果如下:

最后我們需要注意的是,我們可以在上述函數(shù)json_normalize中添加參數(shù) meta_prefix,這樣可以讓我們對(duì)meta中的名字添加統(tǒng)一的前綴。

代碼如下:

pd.json_normalize(superHeroSquad, 
	record_path = ['members'], 
	meta = ['squadName', 'homeTown', 'formed', 'secretBase', 'active'], 
	meta_prefix = 'members_')

運(yùn)行結(jié)果如下:

3.4. 訪問特定位置的數(shù)據(jù)

在Python中我們可以通過Key的名字或者下標(biāo)來訪問JSON文件中任意位置的數(shù)據(jù)。

比如,假設(shè)我們想知道我們的第二個(gè)超級(jí)英雄的秘密身份。即在下圖中,需要訪問特定位置的數(shù)據(jù)在下圖中以紫色突出顯示。

為了得到這個(gè)值,我們可以直接使用以下語句:

superHeroSquad['members'][1]['secretIdentity']

從層次結(jié)構(gòu)的頂部開始,由上往下,我們需要的第一個(gè)key是'members',因?yàn)樗俏覀冃枰L問的值所在的父節(jié)點(diǎn)。

在‘members'對(duì)應(yīng)的鍵值中,我們看中括號(hào),然后下標(biāo)1表示list中的第二個(gè)成員。接著我們來看字段'secretIdentity',如下所示:

將上述過程合并在一起,我們就可以得到我們特定位置出的值為'Jane Wilson'。

細(xì)心的同學(xué)可能已經(jīng)注意到,我在上面的JSON片段中突出顯示了兩個(gè)藍(lán)色的值。希望感興趣的同學(xué)們可以作為練習(xí)來嘗試訪問這些值。歡迎在文章后面的評(píng)論區(qū)中分享你的代碼。

3.5. 導(dǎo)出JSON

讓我們編輯一下我們最后一位超級(jí)英雄,將其secretIdentity從‘Unknow'更改為‘Will Smith',接著將這個(gè)字典導(dǎo)出為JSON文件。這里我們將使用json.dump()函數(shù)將字典寫入文件。

代碼如下:

#update secret identity of Eternal Flame
superHeroSquad['members'][2]['secretIdentity'] = 'Will Smith'
with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file)

上述代碼運(yùn)行后,我們打開文件superheroes.json,可以發(fā)現(xiàn)最后一名超級(jí)英雄的secretIdentity已經(jīng)由Unknow變?yōu)榱薟ill Smith.

當(dāng)然,作為選擇,我們也可以使用Pandas中的to_json()函數(shù),完成上述功能。

df.to_json('superheroes.json')

3.6. 格式化輸出

我們有時(shí)候在終端直接打印json文件,通常會(huì)得到很不美觀的輸出,樣例如下:

為了讓其看起來更加美觀,我們這里可以在函數(shù)json.dump中采用參數(shù)indent參數(shù)來控制輸出格式,代碼如下:

with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file, indent = 4)

結(jié)果輸出如下,是不是看上去更加美觀啦。。。

3.7. 輸出字段排序

當(dāng)然dump函數(shù)中含有字段sort_key,通過設(shè)置其值,可以控制輸出時(shí)是否對(duì)key進(jìn)行排序。需要注意所有的key包括嵌套的key都會(huì)進(jìn)行排序。

樣例如下:

with open('superheroes.json', 'w') as file:
    json.dump(superHeroSquad, file, indent = 4, sort_keys = True)

運(yùn)行結(jié)果如下:

4.總結(jié)

最后,讓我們對(duì)本文做一下回顧,總結(jié)如下:

  • JSON文件通常由key:結(jié)對(duì)組成,這里key通常為字符串格式,value一般為字符串,數(shù)字,布爾,數(shù)組,對(duì)象或者null
  • Python有內(nèi)置函數(shù)可以方便的讀取JSON文件轉(zhuǎn)化為Python中的字典類型或者Pandas可以處理的類型
  • 使用pd.read_json()來讀取簡(jiǎn)單的JSON,使用pd.json_normalize()來讀取嵌套的JSON
  • 我們可以通過key的名字或者下標(biāo)來方便的獲取JSON文件中特定位置的值
  • Python對(duì)象可以轉(zhuǎn)化為JSON文件,同時(shí)可以對(duì)輸出進(jìn)行格式化輸出以增加可讀性

5.參考

鏈接一

到此這篇關(guān)于Python中優(yōu)雅處理JSON文件的文章就介紹到這了,更多相關(guān)Python優(yōu)雅處理JSON文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)稀疏矩陣示例代碼

    python實(shí)現(xiàn)稀疏矩陣示例代碼

    本篇文章主要介紹了python實(shí)現(xiàn)稀疏矩陣示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 在Pandas?DataFrame中插入一列的方法實(shí)例

    在Pandas?DataFrame中插入一列的方法實(shí)例

    在敲代碼的過程中,老是會(huì)遇到在Dataframe中新添加一列的情況,所以下面這篇文章主要給大家介紹了關(guān)于如何在Pandas?DataFrame中插入一列的方法實(shí)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python使用psutil庫實(shí)現(xiàn)系統(tǒng)監(jiān)控與管理詳解

    Python使用psutil庫實(shí)現(xiàn)系統(tǒng)監(jiān)控與管理詳解

    在我們的測(cè)試工作中,監(jiān)控和管理系統(tǒng)資源是一項(xiàng)重要的任務(wù),本文將介紹如何使用psutil庫來實(shí)現(xiàn)系統(tǒng)監(jiān)控和管理,以及一些實(shí)用的技巧和示例,希望對(duì)大家有所幫助
    2022-10-10
  • Python環(huán)境管理virtualenv&virtualenvwrapper的配置詳解

    Python環(huán)境管理virtualenv&virtualenvwrapper的配置詳解

    這篇文章主要介紹了Python環(huán)境管理virtualenv&virtualenvwrapper的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • pandas.read_csv參數(shù)詳解(小結(jié))

    pandas.read_csv參數(shù)詳解(小結(jié))

    這篇文章主要介紹了pandas.read_csv參數(shù)詳解(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python內(nèi)存管理方式和垃圾回收算法解析

    Python內(nèi)存管理方式和垃圾回收算法解析

    這篇文章主要介紹了Python內(nèi)存管理方式和垃圾回收算法解析,介紹了傳統(tǒng)的垃圾回收機(jī)制,其工作方法,finalizer的問題等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • python使用multiprocessing模塊實(shí)現(xiàn)帶回調(diào)函數(shù)的異步調(diào)用方法

    python使用multiprocessing模塊實(shí)現(xiàn)帶回調(diào)函數(shù)的異步調(diào)用方法

    這篇文章主要介紹了python使用multiprocessing模塊實(shí)現(xiàn)帶回調(diào)函數(shù)的異步調(diào)用方法,實(shí)例分析了multiprocessing模塊異步調(diào)用的相關(guān)使用技巧,需要的朋友可以參考下
    2015-04-04
  • pytorch + visdom CNN處理自建圖片數(shù)據(jù)集的方法

    pytorch + visdom CNN處理自建圖片數(shù)據(jù)集的方法

    這篇文章主要介紹了pytorch + visdom CNN處理自建圖片數(shù)據(jù)集的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建方法

    MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建方法

    這篇文章主要介紹了MacOS?Pytorch?機(jī)器學(xué)習(xí)環(huán)境搭建,學(xué)習(xí) Pytorch?,首先要搭建好環(huán)境,這里將采用?Anoconda + Pytorch + PyCharm 來一起構(gòu)建 Pytorch 學(xué)習(xí)環(huán)境,需要的朋友可以參考下
    2023-02-02
  • Pandas讀寫CSV文件的方法示例

    Pandas讀寫CSV文件的方法示例

    這篇文章主要介紹了Pandas讀寫CSV文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

周至县| 江阴市| 灵石县| 彭水| 廉江市| 清河县| 兴安县| 中阳县| 安多县| 昌图县| 县级市| 伊金霍洛旗| 广水市| 天长市| 长岛县| 澄迈县| 荔波县| 太保市| 平泉县| 朝阳县| 平乡县| 乌海市| 定边县| 高要市| 莱西市| 镇江市| 金坛市| 叶城县| 岗巴县| 榕江县| 上林县| 郎溪县| 永康市| 赤峰市| 石渠县| 巫溪县| 长垣县| 诸暨市| 平顺县| 沙坪坝区| 米易县|