javascript
【Python基础】不服不行,Python 操作 JSON 的门道也这么多~
作者:Peter
來源:Python編程時光
在實際工作中,尤其是web數據的傳輸,我們經常會遇到json數據。它不像常見的文本數據、數值數據那樣友好,而且它和Python中的字典類型數據又很相像,給很多人造成了困擾。
本文結合具體案例詳細介紹了如何利用Python和pandas(Python的第三方庫)來處理json數據,主要內容包含:
json數據簡介
常用json數據轉化網站
json數據和Python數據的轉化
pandas處理json數據
1. JSON 簡單介紹
1.1 什么是json數據
首先,我們看一段來自維基百科對json的解釋:
JSON(JavaScript?Object?Notation,JavaScript對象表示法)是一種由道格拉斯·克羅克福特構想和設計、輕量級的資料交換語言,該語言以易于讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的數據對象。
JSON 數據格式與語言無關。即便它源自JavaScript,但目前很多編程語言都支持 JSON 格式數據的生成和解析。文件擴展名是?.json。
通過上面的官方介紹,我們總結3點:
JSON是一種文本(資料)語言,超輕量級的數據交換格式
JSON數據容易閱讀,易讀性強
源自JavaScript,其他語言可解析JSON數據
1.2 json數據類型
JSON實際上是JavaScript的一個子集,JSON語言中僅有的6種數據類型或者它們之間的任意組合:
number:和JavaScript中的number一致
boolean:JavaScript中的true或者false
string:JavaScript中的string
null:JavaScript中的null
array:JavaScript的表示方式:[]
object:JavaScript的{…}表示方式
1.3 兩點規定
1、JSON語言中規定了字符集必須是UTF-8
2、為了統一解析,JSON的字符串規定必須是雙引號""
2. 常用json數據轉化網站
1、json.cn:https://www.json.cn/
2、json菜鳥工具:https://c.runoob.com/front-end/53
3、sojson:https://www.sojson.com/,非常全的json處理網站
4、kjson:https://www.kjson.com/
5、編程獅-json檢驗工具:https://www.w3cschool.cn/tools/index?name=jsoncheck
6、JSONViewer:http://jsonviewer.stack.hu/,用于檢測Json格式是否正確的一個在線應用工具
3. JSON 和 Dict 類型轉化
本小節主要講解的json類型數據和Python類型的轉化。
json對象和Python字典的轉化主要使用的是內置json包,下面詳細介紹該包的使用。詳細的學習資料見官網:https://docs.python.org/3/library/json.html
首先使用的時候直接導入該包:
import?jsonjson包中存在4中方法用來進行和Python內置數據類型的轉化:
| json.dumps() | 將python對象編碼成Json字符串:字典到json |
| json.loads() | 將Json字符串解碼成python對象:json到字典 |
| json.dump() | 將python中的對象轉化成json儲存到文件中 |
| json.load() | 將文件中的json的格式轉化成python對象提取出來 |
筆記:兩個和load相關的方法只是多了一步和文件相關的操作。
json.dumps
和dump相關的兩個函數是將Python數據類型轉成json類型,轉化對照表如下:
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
json.dumps方法的作用是將Python字典類型的數據轉成json格式的數據,具體的參數如下:
json.dumps(obj,???#?待轉化的對象skipkeys=False,??#?默認值是False,若dict的keys內的數據不是python的基本類型(str,unicode,int,long,float,bool,None),設置為False時,就會報TypeError的錯誤。此時設置成True,則會跳過這類key ensure_ascii=True,??#?默認是ASCII碼,若設置成False,則可以輸出中文check_circular=True,??#?若為False,跳過對容器類型的循環引用檢查allow_nan=True,??#?若allow_nan為假,則ValueError將序列化超出范圍的浮點值(nan、inf、-inf),嚴格遵守JSON規范,而不是使用JavaScript等價值(nan、Infinity、-Infinity)cls=None,?indent=None,?#?參數根據格式縮進顯示,表示縮進幾個空格separators=None,???#?指定分隔符;包含不同dict項之間的分隔符和key與value之間的分隔符;同時去掉`:?`encoding="utf-8",??#?編碼default=None,?#?默認是一個函數,應該返回可序列化的obj版本或者引發類型錯誤;默認值是只引發類型錯誤sort_keys=False,??#?若為False,則字典的鍵不排序;設置成True,按照字典排序(a到z)?**kw)通過例子來解釋上面幾個常見參數的作用
1、當我們的Python類型數據中存在中文
information1?=?{'name':?'小明','age':?18,'address':?'shenzhen' } #?字典轉成json數據 information2?=?json.dumps(information1)print(type(information1)) print(type(information2)) print(information2)加上ensure_ascii=False參數即可顯示中文:
#?字典轉成json數據 information3?=?json.dumps(information1,ensure_ascii=False)??通過結果我們發現:json數據中全部變成了雙引號,原來的字典類型數據中使用的是單引號,再看一個關于引號變化的例子:
>>>?import?json >>>?print(json.dumps({'4':?5,?'6':?7},?sort_keys=True,?indent=4))??#?python中的鍵是字符串,用單引號#?結果顯示 {"4":?5,??#?變成雙引號"6":?7 }2、對json數據通過縮進符美觀輸出,使用indent參數
information4?=?{'name':?'小明','age':?18,'skills':?'python','english':?'CET6','major':?'會計','address':?'深圳' }information5?=?json.dumps(information4,?ensure_ascii=False)???#?不縮進 information6?=?json.dumps(information4,?ensure_ascii=False,?indent=2)??#?縮進2個空格?? information7?=?json.dumps(information4,?ensure_ascii=False,?indent=5)??#?縮進5個空格print(information5) print(information6) print(information7)3、對Python數據類型中鍵進行排序輸出
information4?=?{'name':?'小明','age':?18,'skills':?'python','english':?'CET6','major':?'會計','address':?'深圳' }information8?=?json.dumps(information4,?ensure_ascii=False,?indent=2)??#? information9?=?json.dumps(information4,?ensure_ascii=False,?indent=2,sort_keys=True)??#??鍵的排序設置成True?print(information8) print(information9)通過sort_keys=True的設置,可以觀察到輸出的結果進行了首寫字母的排序;當首寫字母相同,按照第二個字母再進行排序。
4、輸出分隔符的控制
使用separators參數來設置不同的輸出分隔符;不同的dic元素之間默認是,,鍵值對之間默認是:
information1?=?{'name':?'小明','age':?18,'address':?'shenzhen' }information2?=?json.dumps(information1,ensure_ascii=False) information10?=?json.dumps(information1,ensure_ascii=False,separators=('+','@'))??#?改變分隔符print(information2)??#?默認連接符 print(information10)??json.dump
json.dump功能和json.dumps類似,只是需要將數據存入到文件中,二者參數相同
我們嘗試將下面的個人信息寫入到文件中
information?=?{'name':?'小明','age':?18,'skills':?'python','english':?'CET6','major':?'會計','address':?'深圳' }1、如果不使用indent參數,全部信息顯示為一行
#?使用json.dump;json數據一定是雙引號with?open("information_1_to_json.json",?"w",?encoding='utf-8')?as?f:#?json.dump(dic_,?f)?#?全部寫入一行數據,不換行json.dump(information,???#?待寫入數據f,?#?File對象sort_keys=True,??#?鍵的排序ensure_ascii=False)??#?顯示中文看看實際的保存效果:
加入indent參數,會顯示成多行數據:
with?open("information_2_to_json.json",?"w",?encoding='utf-8')?as?f:json.dump(information,?f,?indent=2,??#?空格縮進符,寫入多行sort_keys=True,?ensure_ascii=False)?json.loads
和load相關的兩個函數是將json轉成Python數據類型,轉化對照表如下:
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
json.loads的作用是將json格式的數據轉成Python字典類型的數據。
information1?=?{'name':?'小明','age':?18,'address':?'shenzhen' } #?字典轉成json數據 information3?=?json.dumps(information1,ensure_ascii=False)information11?=?json.loads(information3)??#?json轉成字典數據 print(information11)json.load
打開json文件再轉成字典形式的數據
#?使用json.loadwith?open("information_to_json.json",encoding="utf-8")?as?f:json_to_dict?=?json.load(f)??#?json轉成字典print(json_to_dict)4. JSON 和 非 Dict 類型的轉化
上面介紹的主要是json格式數據和Python字典之間的轉化,下面講解了Python其他數據類型通過json.dumps方法轉成json個數據:
1、元組轉化
2、列表轉化
3、布爾值轉化
4、數值型數據轉化
5. 利用 Demjson 來解析
Demjson是Python的第三方庫,能夠用于編碼和解碼json數據:
encode:將 Python 對象編碼成 JSON 字符串
decode:將已編碼的 JSON 字符串解碼為 Python 對象
安裝demjson
直接使用pip install demjson安裝,kan'dao看到如下界面表示安裝成功。
使用demjson
使用之前先進行導入:
import?demjson???#?導入包1、編碼功能
2、解碼功能
demjson包一個明顯的缺點就是不能直接解析中文數據:
如果我們想看到中文數據,可以使用eval函數:
6. Pandas處理 json
下面介紹pandas庫對json數據的處理:
read_json:從json文件中讀取數據
to_json:將pandas中的數據寫入到json文件中
json_normalize:對json數據進行規范化處理
https://geek-docs.com/pandas/pandas-read-write/pandas-reading-and-writing-json.html
6.1 read_json
首先看看官網中read_json的參數:
pandas.read_json(path_or_buf=None,??#?json文件路徑orient=None,??#?重點參數,取值為:"split"、"records"、"index"、"columns"、"values"typ='frame',???#?要恢復的對象類型(系列或框架),默認’框架’.dtype=None,?#?boolean或dict,默認為Trueconvert_axes=None,?convert_dates=True,?keep_default_dates=True,?numpy=False,?precise_float=False,?date_unit=None,?encoding=None,?lines=False,??#?布爾值,默認為False,每行讀取該文件作為json對象chunksize=None,compression='infer',?nrows=None,?storage_options=None)詳細的參數解析可以參考文章:https://blog.csdn.net/qq_41562377/article/details/90203805
假設我們現在有一份json數據,如下圖所示:
我們將上面的數據讀取進來,由于數據是比較規范的,所以直接填寫文件路徑即可讀取:
重點講解下參數orient:
1、oriden='split'
split’?:?dict?like?{index?->?[index],?columns?->?[columns],?data?->?[values]}json文件的key的名字只能為index,cloumns,data這三個,另外多一個key都不行,少一個也不行。舉例說明:
2、orient='records'
‘records’?:?list?like?[{column?->?value},?…?,?{column?->?value}]3、orient='index'
dict?like?{index?->?{column?->?value}}4、orient='columns'
dict?like?{column?->?{index?->?value}}轉置之后就是上面orient='index'的結果
5、orient='values'
‘values’?:?just?the?values?array6.2 to_json
to_json方法就是將DataFrame文件保存成json文件:
df.to_json("個人信息.json")???#?直接保存成json文件如果按照上面的代碼保存,中文是沒有顯示的:
當然我們可以通過json.load將json文件再次讀取進行,顯示中文,我們也可以直接在保存的時候顯示中文:
df.to_json("個人信息1.json",force_ascii=False)???#?顯示中文6.3 json_normalize
https://www.jianshu.com/p/a84772b994a0
上面介紹的json數據的保存和讀取中json數據都是列表形式的;但是json文件中的數據通常不一定全部是列表形式,那么我們需要將字典結構的文件轉成列表形式,這個過程就叫做規范化。
pandas中的json_normalize()函數能夠將字典或列表轉成表格,使用之前先進行導入:
from?pandas.io.json?import?json_normalize通過官網和一個實際的例子來同時進行學習,首先看看官網的例子:
1、層級字典通過屬性的形式顯示數據:
2、如果加入max_level參數則會顯示不同的效果:
若max_level=0,則嵌套的字典會當做整體,顯示在數據框中
若max_level=1,則嵌套的字典會被拆解,里面的鍵會被單獨出來:
3、讀取層級嵌套中的部分內容:
4、讀取全部內容
7. 總結一下
json數據是工作中經常會遇到的一種數據格式,也是很重要的一種數據。
本文首先對json數據及格式進行了簡介,重新認識json數據;其次,結合各種實際案例,將json和Python的各種數據類型,尤其是字典類型進行了轉化;最后,重要講解了json數據的讀取、寫入和規范化的操作。
希望這篇文章的詳細講解,能夠幫助到各位搞定json數據~
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站qq群704220115,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python基础】不服不行,Python 操作 JSON 的门道也这么多~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Foxmail怎么诊断邮件的状态
- 下一篇: QQ浏览器怎么把文件添加到私密空间 怎么