python中json操作之json.loads、json.load、json.jumps及json.jump用法
前言
經(jīng)常在Python中對(duì)JSON格式的文件進(jìn)行操作,今天對(duì)這些操作做一個(gè)總結(jié)
首先,需要導(dǎo)入json庫(kù)import json
0.python類(lèi)型與json類(lèi)型互換表
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
什么是json字符串?
相較于JSON對(duì)象,JSON字符串(可以理解為一個(gè)普通的字符串但擁有特殊的格式 這種格式可以用來(lái)轉(zhuǎn)換回JSON對(duì)象)可以更加方便的在函數(shù)之間傳遞。
JSON對(duì)象中只能使用雙引號(hào)""
而python對(duì)象字典中可以使用單引號(hào)''
1.將json字符串轉(zhuǎn)化(反序列化)
(1)json.loads
將JSON字符串轉(zhuǎn)化為 Python 字段的數(shù)據(jù)類(lèi)型。
loads:針對(duì)內(nèi)存對(duì)象,將string轉(zhuǎn)換為dict (將string轉(zhuǎn)換為dict)
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object."""
json.loads 用于解碼 JSON 數(shù)據(jù)。該函數(shù)返回 Python 字段的數(shù)據(jù)類(lèi)型。
jsonData='{"\u6d4b\u8bd5": 12345, "\u5185\u5bb9": ["\u6211\u4e5f\u4e0d\u77e5\u9053\u6211\u8981\u5199\u4ec0\u4e48", "123"]}' print(jsonData) print(type(jsonData)) # <class 'str'> 理解為json字符串 py_type_info=json.loads(jsonData) print(py_type_info) print(type(py_type_info)) # <class 'dict'> # 輸出: #{"測(cè)試": 12345, "內(nèi)容": ["我也不知道我要寫(xiě)什么", "123"]} # <class 'str'> # {'測(cè)試': 12345, '內(nèi)容': ['我也不知道我要寫(xiě)什么', '123']} # <class 'dict'>
可以從上面輸出中看到 JSON 的雙引號(hào) 與python dict的單引號(hào)
(2)json.load
json.load用于讀取.json格式的文件,將JSON文件 轉(zhuǎn)化成Python字段的數(shù)據(jù)類(lèi)型
load:針對(duì)文件句柄,將json格式的字符轉(zhuǎn)換為dict,從文件中讀取 (將string轉(zhuǎn)換為dict)
def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object."""
with open('abc.json','r',encoding='utf-8')as f: py_type_info = json.load(f) print(py_type_info)
with open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "r", encoding='utf-8') as f: cmpInfo=json.load(f)
延伸:如果.json文件中有注釋怎么辦
參考資料:Pythonh中用json.load() json.loads()加載json數(shù)據(jù)的方法
提醒:根據(jù)JSON規(guī)范(http://www.json.org, RFC 4627, RFC 7159),不支持注釋。
但如果真的不幸遇到j(luò)son文件中有 // 類(lèi)似的注釋如何解決?
def load_json(path): import json lines = [] # 第一步:定義一個(gè)列表, 打開(kāi)文件 with open(path) as f: for row in f.readlines(): # 第二步:讀取文件內(nèi)容 if row.strip().startswith("http://"): # 第三步:對(duì)每一行進(jìn)行過(guò)濾 continue lines.append(row) # 第四步:將過(guò)濾后的行添加到列表中. return json.loads("\n".join(lines)) #將列表中的每個(gè)字符串用某一個(gè)符號(hào)拼接為一整個(gè)字符串,用json.loads()函數(shù)加載,這樣就大功告成啦!!
2.將python對(duì)象轉(zhuǎn)化(序列化)
(1)json.dumps
json.dumps 用于將 Python 對(duì)象 編碼成 JSON 字符串。
注意:這個(gè)函數(shù)產(chǎn)生的是字符串
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
- obj:轉(zhuǎn)化成json的對(duì)象。
- skipkeys:默認(rèn)值是False,如果dict的keys內(nèi)的數(shù)據(jù)不是python的基本類(lèi)型(str,unicode,int,long,float,bool,None),設(shè)置為False時(shí),就會(huì)報(bào)TypeError的錯(cuò)誤。此時(shí)設(shè)置成True,則會(huì)跳過(guò)這類(lèi)key 。
- ensure_ascii=True:默認(rèn)輸出ASCLL碼,如果把這個(gè)該成False,就可以輸出中文。
- check_circular:如果check_circular為false,則跳過(guò)對(duì)容器類(lèi)型的循環(huán)引用檢查,循環(huán)引用將導(dǎo)致溢出錯(cuò)誤(或更糟的情況)。
- allow_nan:如果allow_nan為假,則ValueError將序列化超出范圍的浮點(diǎn)值(nan、inf、-inf),嚴(yán)格遵守JSON規(guī)范,而不是使用JavaScript等價(jià)值(nan、Infinity、-Infinity)。
- default:default(obj)是一個(gè)函數(shù),它應(yīng)該返回一個(gè)可序列化的obj版本或引發(fā)類(lèi)型錯(cuò)誤。默認(rèn)值只會(huì)引發(fā)類(lèi)型錯(cuò)誤。
- sort_keys =True:是告訴編碼器按照字典排序(a到z)輸出。如果是字典類(lèi)型的python對(duì)象,就把關(guān)鍵字按照字典排序。
- indent:參數(shù)根據(jù)數(shù)據(jù)格式縮進(jìn)顯示,讀起來(lái)更加清晰。
- separators:是分隔符的意思,參數(shù)意思分別為不同dict項(xiàng)之間的分隔符和dict項(xiàng)內(nèi)key和value之間的分隔符,把:和,后面的空格都除去了。
j1={'測(cè)試':12345,'內(nèi)容':['我也不知道我要寫(xiě)什么','123']} j1_str=json.dumps(j1) print(j1) # 輸出:{'測(cè)試': 12345, '內(nèi)容': ['我也不知道我要寫(xiě)什么', '123']}
(2)json.dump
將Python對(duì)象編碼成JSON文件
j1={'測(cè)試':12345,'內(nèi)容':['我也不知道我要寫(xiě)什么','123']} with open('abc.json','w') as f: json.dump(j1,f)
abc.json中寫(xiě)入了Python對(duì)象j1編碼出的json格式信息:
{"\u6d4b\u8bd5": 12345, "\u5185\u5bb9": ["\u6211\u4e5f\u4e0d\u77e5\u9053\u6211\u8981\u5199\u4ec0\u4e48", "123"]}
總結(jié)
到此這篇關(guān)于python中json操作之json.loads、json.load、json.jumps及json.jump用法總結(jié)的文章就介紹到這了,更多相關(guān)python json操作用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django的auth認(rèn)證,authenticate和裝飾器功能詳解
這篇文章主要介紹了django的auth認(rèn)證,authenticate和裝飾器功能詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python如何使用socketserver模塊實(shí)現(xiàn)并發(fā)聊天
這篇文章主要介紹了python如何使用socketserver模塊實(shí)現(xiàn)并發(fā)聊天,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)
這篇文章主要介紹了selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11基于Python實(shí)現(xiàn)繪制簡(jiǎn)單動(dòng)圖的示例詳解
動(dòng)畫(huà)是一種高效的可視化工具,能夠提升用戶的吸引力和視覺(jué)體驗(yàn),有助于以富有意義的方式呈現(xiàn)數(shù)據(jù)可視化,本文的主要介紹在Python中兩種簡(jiǎn)單制作動(dòng)圖的方法,需要的可以了解下2023-10-10python常規(guī)方法實(shí)現(xiàn)數(shù)組的全排列
這篇文章主要介紹了python常規(guī)方法實(shí)現(xiàn)數(shù)組的全排列,實(shí)例分析了全排列的概念及Python常規(guī)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03