在實(shí)際工作中,尤其是web數(shù)據(jù)的傳輸,我們經(jīng)常會(huì)遇到j(luò)son數(shù)據(jù)。它不像常見的文本數(shù)據(jù)、數(shù)值數(shù)據(jù)那樣友好,而且它和Python中的字典類型數(shù)據(jù)又很相像,給很多人造成了困擾。
本文結(jié)合具體案例詳細(xì)介紹了如何利用Python和pandas(Python的第三方庫(kù))來(lái)處理json數(shù)據(jù),主要內(nèi)容包含:
- json數(shù)據(jù)簡(jiǎn)介
- 常用json數(shù)據(jù)轉(zhuǎn)化網(wǎng)站
- json數(shù)據(jù)和Python數(shù)據(jù)的轉(zhuǎn)化
- pandas處理json數(shù)據(jù)
1. JSON 簡(jiǎn)單介紹
1.1 什么是json數(shù)據(jù)
首先,我們看一段來(lái)自維基百科對(duì)json的解釋:
JSON (JavaScript Object Notation,JavaScript對(duì)象表示法)是一種由道格拉斯·克羅克福特構(gòu)想和設(shè)計(jì)、輕量級(jí)的資料交換語(yǔ)言,該語(yǔ)言以易于讓人閱讀的文字為基礎(chǔ),用來(lái)傳輸由屬性值或者序列性的值組成的數(shù)據(jù)對(duì)象。
JSON 數(shù)據(jù)格式與語(yǔ)言無(wú)關(guān)。即便它源自JavaScript,但目前很多編程語(yǔ)言都支持 JSON 格式數(shù)據(jù)的生成和解析。文件擴(kuò)展名是
.json
。
通過(guò)上面的官方介紹,我們總結(jié)3點(diǎn):
- JSON是一種文本(資料)語(yǔ)言,超輕量級(jí)的數(shù)據(jù)交換格式
- JSON數(shù)據(jù)容易閱讀,易讀性強(qiáng)
- 源自JavaScript,其他語(yǔ)言可解析JSON數(shù)據(jù)
1.2 json數(shù)據(jù)類型
JSON實(shí)際上是JavaScript的一個(gè)子集,JSON語(yǔ)言中僅有的6種數(shù)據(jù)類型或者它們之間的任意組合:
- number:和JavaScript中的number一致
- boolean:JavaScript中的true或者false
- string:JavaScript中的string
- null:JavaScript中的null
- array:JavaScript的表示方式:[]
- object:JavaScript的
{…}
表示方式
1.3 兩點(diǎn)規(guī)定
1、JSON語(yǔ)言中規(guī)定了字符集必須是UTF-8
2、為了統(tǒng)一解析,JSON的字符串規(guī)定必須是雙引號(hào)""
2. 常用json數(shù)據(jù)轉(zhuǎn)化網(wǎng)站
1、json.cn:https://www.json.cn/
2、json菜鳥工具:https://c.runoob.com/front-end/53
3、sojson:https://www.sojson.com/,非常全的json處理網(wǎng)站
4、kjson:https://www.kjson.com/
5、編程獅-json檢驗(yàn)工具:https://www.w3cschool.cn/tools/index?name=jsoncheck
6、JSONViewer:http://jsonviewer.stack.hu/,用于檢測(cè)Json格式是否正確的一個(gè)在線應(yīng)用工具
3. JSON 和 Dict 類型轉(zhuǎn)化
本小節(jié)主要講解的json類型數(shù)據(jù)和Python類型的轉(zhuǎn)化。
json
對(duì)象和Python
字典的轉(zhuǎn)化主要使用的是內(nèi)置json
包,下面詳細(xì)介紹該包的使用。詳細(xì)的學(xué)習(xí)資料見官網(wǎng):https://docs.python.org/3/library/json.html
首先使用的時(shí)候直接導(dǎo)入該包:
import json
json
包中存在4中方法用來(lái)進(jìn)行和Python內(nèi)置數(shù)據(jù)類型的轉(zhuǎn)化:
方法 | 作用 |
---|---|
json.dumps() | 將python對(duì)象編碼成Json字符串:字典到j(luò)son |
json.loads() | 將Json字符串解碼成python對(duì)象:json到字典 |
json.dump() | 將python中的對(duì)象轉(zhuǎn)化成json儲(chǔ)存到文件中 |
json.load() | 將文件中的json的格式轉(zhuǎn)化成python對(duì)象提取出來(lái) |
筆記:兩個(gè)和load相關(guān)的方法只是多了一步和文件相關(guān)的操作。
json.dumps
和dump相關(guān)的兩個(gè)函數(shù)是將Python數(shù)據(jù)類型轉(zhuǎn)成json類型,轉(zhuǎn)化對(duì)照表如下:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
json.dumps
方法的作用是將Python字典類型的數(shù)據(jù)轉(zhuǎn)成json格式的數(shù)據(jù),具體的參數(shù)如下:
json.dumps(obj, # 待轉(zhuǎn)化的對(duì)象
skipkeys=False, # 默認(rèn)值是False,若dict的keys內(nèi)的數(shù)據(jù)不是python的基本類型(str,unicode,int,long,float,bool,None),設(shè)置為False時(shí),就會(huì)報(bào)TypeError的錯(cuò)誤。此時(shí)設(shè)置成True,則會(huì)跳過(guò)這類key
ensure_ascii=True, # 默認(rèn)是ASCII碼,若設(shè)置成False,則可以輸出中文
check_circular=True, # 若為False,跳過(guò)對(duì)容器類型的循環(huán)引用檢查
allow_nan=True, # 若allow_nan為假,則ValueError將序列化超出范圍的浮點(diǎn)值(nan、inf、-inf),嚴(yán)格遵守JSON規(guī)范,而不是使用JavaScript等價(jià)值(nan、Infinity、-Infinity)
cls=None,
indent=None, # 參數(shù)根據(jù)格式縮進(jìn)顯示,表示縮進(jìn)幾個(gè)空格
separators=None, # 指定分隔符;包含不同dict項(xiàng)之間的分隔符和key與value之間的分隔符;同時(shí)去掉`: `
encoding="utf-8", # 編碼
default=None, # 默認(rèn)是一個(gè)函數(shù),應(yīng)該返回可序列化的obj版本或者引發(fā)類型錯(cuò)誤;默認(rèn)值是只引發(fā)類型錯(cuò)誤
sort_keys=False, # 若為False,則字典的鍵不排序;設(shè)置成True,按照字典排序(a到z)
**kw)
通過(guò)例子來(lái)解釋上面幾個(gè)常見參數(shù)的作用
1、當(dāng)我們的Python類型數(shù)據(jù)中存在中文
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
# 字典轉(zhuǎn)成json數(shù)據(jù)
information2 = json.dumps(information1)
print(type(information1))
print(type(information2))
print(information2)
加上ensure_ascii=False
參數(shù)即可顯示中文:
# 字典轉(zhuǎn)成json數(shù)據(jù)
information3 = json.dumps(information1,ensure_ascii=False)
??通過(guò)結(jié)果我們發(fā)現(xiàn): json數(shù)據(jù)中全部變成了雙引號(hào),原來(lái)的字典類型數(shù)據(jù)中使用的是單引號(hào) ,再看一個(gè)關(guān)于引號(hào)變化的例子:
>> > import json
>> > print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)) # python中的鍵是字符串,用單引號(hào)
# 結(jié)果顯示
{
"4": 5, # 變成雙引號(hào)
"6": 7
}
2、對(duì)json數(shù)據(jù)通過(guò)縮進(jìn)符美觀輸出,使用indent參數(shù)
information4 = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '會(huì)計(jì)',
'address': '深圳'
}
information5 = json.dumps(information4, ensure_ascii=False) # 不縮進(jìn)
information6 = json.dumps(information4, ensure_ascii=False, indent=2) # 縮進(jìn)2個(gè)空格
information7 = json.dumps(information4, ensure_ascii=False, indent=5) # 縮進(jìn)5個(gè)空格
print(information5)
print(information6)
print(information7)
3、對(duì)Python數(shù)據(jù)類型中鍵進(jìn)行排序輸出
information4 = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '會(huì)計(jì)',
'address': '深圳'
}
information8 = json.dumps(information4, ensure_ascii=False, indent=2) #
information9 = json.dumps(information4, ensure_ascii=False, indent=2,sort_keys=True) # 鍵的排序設(shè)置成True
print(information8)
print(information9)
通過(guò)sort_keys=True
的設(shè)置,可以觀察到輸出的結(jié)果進(jìn)行了首寫字母的排序;當(dāng)首寫字母相同,按照第二個(gè)字母再進(jìn)行排序。
4、輸出分隔符的控制
使用separators
參數(shù)來(lái)設(shè)置不同的輸出分隔符;不同的dic元素之間默認(rèn)是,
,鍵值對(duì)之間默認(rèn)是:
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
information2 = json.dumps(information1,ensure_ascii=False)
information10 = json.dumps(information1,ensure_ascii=False,separators=('+','@')) # 改變分隔符
print(information2) # 默認(rèn)連接符
print(information10)
json.dump
json.dump
功能和json.dumps
類似,只是需要將數(shù)據(jù)存入到文件中,二者參數(shù)相同
我們嘗試將下面的個(gè)人信息寫入到文件中
information = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '會(huì)計(jì)',
'address': '深圳'
}
1、如果不使用indent
參數(shù),全部信息顯示為一行
# 使用json.dump;json數(shù)據(jù)一定是雙引號(hào)
with open("information_1_to_json.json", "w", encoding='utf-8') as f:
# json.dump(dic_, f) # 全部寫入一行數(shù)據(jù),不換行
json.dump(information, # 待寫入數(shù)據(jù)
f, # File對(duì)象
sort_keys=True, # 鍵的排序
ensure_ascii=False) # 顯示中文
看看實(shí)際的保存效果:
加入indent
參數(shù),會(huì)顯示成多行數(shù)據(jù):
with open("information_2_to_json.json", "w", encoding='utf-8') as f:
json.dump(information,
f,
indent=2, # 空格縮進(jìn)符,寫入多行
sort_keys=True,
ensure_ascii=False)
json.loads
和load
相關(guān)的兩個(gè)函數(shù)是將json轉(zhuǎn)成Python數(shù)據(jù)類型,轉(zhuǎn)化對(duì)照表如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
json.loads
的作用是將json格式的數(shù)據(jù)轉(zhuǎn)成Python字典類型的數(shù)據(jù)。
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
# 字典轉(zhuǎn)成json數(shù)據(jù)
information3 = json.dumps(information1,ensure_ascii=False)
information11 = json.loads(information3) # json轉(zhuǎn)成字典數(shù)據(jù)
print(information11)
json.load
打開json文件再轉(zhuǎn)成字典形式的數(shù)據(jù)
# 使用json.load
with open("information_to_json.json",encoding="utf-8") as f:
json_to_dict = json.load(f) # json轉(zhuǎn)成字典
print(json_to_dict)
4. JSON 和 非 Dict 類型的轉(zhuǎn)化
上面介紹的主要是json格式數(shù)據(jù)和Python字典之間的轉(zhuǎn)化,下面講解了Python其他數(shù)據(jù)類型通過(guò)json.dumps
方法轉(zhuǎn)成json個(gè)數(shù)據(jù):
1、元組轉(zhuǎn)化
2、列表轉(zhuǎn)化
3、布爾值轉(zhuǎn)化
4、數(shù)值型數(shù)據(jù)轉(zhuǎn)化
5. 利用 Demjson 來(lái)解析
Demjson
是Python
的第三方庫(kù),能夠用于編碼和解碼json
數(shù)據(jù):
- encode:將 Python 對(duì)象編碼成 JSON 字符串
- decode:將已編碼的 JSON 字符串解碼為 Python 對(duì)象
安裝demjson
直接使用pip install demjson
安裝,kan'dao看到如下界面表示安裝成功。
使用demjson
使用之前先進(jìn)行導(dǎo)入:
import demjson # 導(dǎo)入包
1、編碼功能
2、解碼功能
demjson
包一個(gè)明顯的缺點(diǎn)就是不能直接解析中文數(shù)據(jù):
如果我們想看到中文數(shù)據(jù),可以使用eval函數(shù):
6. Pandas處理 json
下面介紹pandas庫(kù)對(duì)json數(shù)據(jù)的處理:
- read_json:從json文件中讀取數(shù)據(jù)
- to_json:將pandas中的數(shù)據(jù)寫入到j(luò)son文件中
- json_normalize:對(duì)json數(shù)據(jù)進(jìn)行規(guī)范化處理
https://geek-docs.com/pandas/pandas-read-write/pandas-reading-and-writing-json.html
6.1 read_json
首先看看官網(wǎng)中read_json
的參數(shù):
pandas.read_json(
path_or_buf=None, # json文件路徑
orient=None, # 重點(diǎn)參數(shù),取值為:"split"、"records"、"index"、"columns"、"values"
typ='frame', # 要恢復(fù)的對(duì)象類型(系列或框架),默認(rèn)’框架’.
dtype=None, # boolean或dict,默認(rèn)為True
convert_axes=None,
convert_dates=True,
keep_default_dates=True,
numpy=False,
precise_float=False,
date_unit=None,
encoding=None,
lines=False, # 布爾值,默認(rèn)為False,每行讀取該文件作為json對(duì)象
chunksize=None,
compression='infer',
nrows=None,
storage_options=None)
詳細(xì)的參數(shù)解析可以參考文章:https://blog.csdn.net/qq_41562377/article/details/90203805
假設(shè)我們現(xiàn)在有一份json數(shù)據(jù),如下圖所示:
我們將上面的數(shù)據(jù)讀取進(jìn)來(lái),由于數(shù)據(jù)是比較規(guī)范的,所以直接填寫文件路徑即可讀取:
重點(diǎn)講解下參數(shù)orient
:
1、oriden='split'
split’ : dict like {index - > [index], columns - > [columns], data - > [values]}
json文件的key的名字只能為index,cloumns,data
這三個(gè),另外多一個(gè)key都不行,少一個(gè)也不行。舉例說(shuō)明:
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}}
轉(zhuǎn)置之后就是上面orient='index'
的結(jié)果
5、orient='values'
‘values’ : just the values array
6.2 to_json
to_json
方法就是將DataFrame文件保存成json文件:
df.to_json("個(gè)人信息.json") # 直接保存成json文件
如果按照上面的代碼保存,中文是沒(méi)有顯示的:
當(dāng)然我們可以通過(guò)json.load
將json文件再次讀取進(jìn)行,顯示中文,我們也可以直接在保存的時(shí)候顯示中文:
df.to_json("個(gè)人信息1.json",force_ascii=False) # 顯示中文
6.3 json_normalize
https://www.jianshu.com/p/a84772b994a0
上面介紹的json數(shù)據(jù)的保存和讀取中json數(shù)據(jù)都是列表形式的;但是json文件中的數(shù)據(jù)通常不一定全部是列表形式,那么我們需要將字典結(jié)構(gòu)的文件轉(zhuǎn)成列表形式,這個(gè)過(guò)程就叫做規(guī)范化。
pandas中的json_normalize()
函數(shù)能夠?qū)⒆值浠蛄斜磙D(zhuǎn)成表格,使用之前先進(jìn)行導(dǎo)入:
from pandas.io.json import json_normalize
通過(guò)官網(wǎng)和一個(gè)實(shí)際的例子來(lái)同時(shí)進(jìn)行學(xué)習(xí),首先看看官網(wǎng)的例子:
1、層級(jí)字典通過(guò)屬性的形式顯示數(shù)據(jù):
2、如果加入max_level參數(shù)則會(huì)顯示不同的效果:
若max_level=0,則嵌套的字典會(huì)當(dāng)做整體,顯示在數(shù)據(jù)框中
若max_level=1,則嵌套的字典會(huì)被拆解,里面的鍵會(huì)被單獨(dú)出來(lái):
3、讀取層級(jí)嵌套中的部分內(nèi)容:
4、讀取全部?jī)?nèi)容
7. 總結(jié)一下
json
數(shù)據(jù)是工作中經(jīng)常會(huì)遇到的一種數(shù)據(jù)格式,也是很重要的一種數(shù)據(jù)。
本文首先對(duì)json
數(shù)據(jù)及格式進(jìn)行了簡(jiǎn)介,重新認(rèn)識(shí)json
數(shù)據(jù);其次,結(jié)合各種實(shí)際案例,將json
和Python
的各種數(shù)據(jù)類型,尤其是字典類型進(jìn)行了轉(zhuǎn)化;最后,重要講解了json
數(shù)據(jù)的讀取、寫入和規(guī)范化的操作。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7134瀏覽量
89406 -
網(wǎng)站
+關(guān)注
關(guān)注
2文章
259瀏覽量
23213 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
84959 -
JSON
+關(guān)注
關(guān)注
0文章
119瀏覽量
6999
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論