色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

瀏覽:108日期:2022-07-13 17:21:25
1. 數(shù)據(jù)抽取的概念

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

2. 數(shù)據(jù)的分類

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

3. JSON數(shù)據(jù)概述及解析3.1 JSON數(shù)據(jù)格式

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

3.2 解析庫(kù)json

json模塊是Python內(nèi)置標(biāo)準(zhǔn)庫(kù),主要可以完成兩個(gè)功能:序列化和反序列化。JSON對(duì)象和Python對(duì)象映射圖如下:

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

3.2.1 json序列化

對(duì)象(字典/列表) 通過 json.dump()/json.dumps() ==> json字符串。示例代碼如下:

import jsonclass Phone(object): def __init__(self, name, price): self.name = name self.price = priceclass Default(json.JSONEncoder): def default(self, o): print(o) # o: <__main__.Phone object at 0x10aa52c90> return [o.name, o.price]def parse(obj): print(obj) return {'name': obj.name, 'price': obj.price}person_info_dict = { 'name': 'Amo', 'age': 18, 'is_boy': True, # 'n': float('nan'), # float('nan'):NaN float('inf')=>Infinity float('-inf')=>-Infinity 'phone': Phone('蘋果8plus', 6458), 'hobby': ('sing', 'dance'), 'dog': { 'name': '藏獒', 'age': 5, 'color': '棕色', 'isVIP': True, 'child': None },}'''obj:需要序列化的對(duì)象 字典/列表 這里指的是person_info_dictindent: 縮進(jìn) 單位: 字符sort_keys: 是否按key排序 默認(rèn)是False不排序cls: json.JSONEncoder子類 處理不能序列化的對(duì)象ensure_ascii: 是否確保ascii編碼 默認(rèn)是True確保 '蘋果8plus'==>'u82f9u679c8plus' 所以改為Falsedefault: 對(duì)象不能被序列化時(shí),調(diào)用對(duì)應(yīng)的函數(shù)解析'''# 將結(jié)果返回給一個(gè)變量result = json.dumps(person_info_dict, indent=2, sort_keys=True, ensure_ascii=False, # cls=Default, default=parse, # allow_nan=False 是否處理特殊常量值 # 默認(rèn)為True 但是JSON標(biāo)準(zhǔn)規(guī)范不支持NaN, Infinity和-Infinity )print(result)with open('dump.json', 'w', encoding='utf8') as file: # json.dump是將序列化后的內(nèi)容存儲(chǔ)到文件中 其他參數(shù)用法和dumps一致 json.dump(person_info_dict, file, indent=4, ensure_ascii=False, default=parse)

3.2.2 json反序列化

json字符串通過json.load()/json.loads()==> 對(duì)象(字典/列表),示例代碼如下:

import jsonclass Phone(object): def __init__(self, name, price): self.name = name self.price = pricedef pi(num): return int(num) + 1def oh(dic): if 'price' in dic.keys(): return Phone(dic['name'], dic['price']) return dicdef oph(*args, **kwargs): print(*args, **kwargs)# 我自己本地有一個(gè)dump.json文件with open('dump.json', 'r', encoding='utf8') as file: # content = file.read() # parse_int/float: 整數(shù)/浮點(diǎn)數(shù)鉤子函數(shù) # object_hook: 對(duì)象解析鉤子函數(shù) 將字典轉(zhuǎn)為特定對(duì)象 傳遞給函數(shù)的是字典對(duì)象 # object_pairs_hook: 轉(zhuǎn)化為特定對(duì)象 傳遞的是元組列表 # parse_constant: 常量鉤子函數(shù) NaN/Infinity/-Infinity # result = json.loads(content, object_hook=oh, parse_int=pi, object_pairs_hook=oph) result = json.load(file, parse_int=pi, object_hook=oh) # 直接將文件對(duì)象傳入 print(type(result)) # <class ’dict’> print(result)4. jsonpath

jsonpath三方庫(kù),點(diǎn)擊這里這里進(jìn)入官網(wǎng),通過路徑表達(dá)式,來快速獲取字典當(dāng)中的指定數(shù)據(jù),靈感來自xpath表達(dá)式。命令安裝:

pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jsonpath

或者:

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

4.1 使用

語法格式如下:

from jsonpath import jsonpathdic = {....} # 要找數(shù)據(jù)的字典jsonpath(dic, 表達(dá)式)

常用的表達(dá)式語法如下:

JSONPath 描述 $ 根節(jié)點(diǎn)(假定的外部對(duì)象,可以理解為上方的dic) @ 現(xiàn)行節(jié)點(diǎn)(當(dāng)前對(duì)象) .或者[] 取子節(jié)點(diǎn)(子對(duì)象) .. 就是不管位置,選擇所有符合條件的節(jié)點(diǎn)(后代對(duì)象) * 匹配所有元素節(jié)點(diǎn) [] 迭代集合,謂詞條件,下標(biāo) [,] 多選 ?() 支持過濾操作 () 支持表達(dá)式操作 [start: end : step] 切片

4.2 使用示例

案例一用到的字典如下:

dic = { 'person': { 'name': 'Amo', 'age': 18, 'dog': [{ 'name': '小花', 'color': 'red', 'age': 6, 'isVIP': True }, { 'name': '小黑', 'color': 'black', 'age': 2 }] }}

將上述抽象成一個(gè)樹形結(jié)構(gòu)如圖所示:

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

需求及結(jié)果如下:

JSONPath Result $.person.age 獲取人的年齡 $..dog[1].age 獲取第2個(gè)小狗的年齡 $..dog[0,1].age | $..dog[*].age 獲取所有小狗的年齡 $..dog[?(@.isVIP)] 獲取是VIP的小狗 $..dog[?(@.age>2)] 獲取年齡大于2的小狗 $..dog[-1:] | $..dog[(@.length-1)] 獲取最后一個(gè)小狗

代碼如下:

from jsonpath import jsonpathdic = { 'person': { 'name': 'Amo', 'age': 18, 'dog': [{ 'name': '小花', 'color': 'red', 'age': 6, 'isVIP': True }, { 'name': '小黑', 'color': 'black', 'age': 2 }] }}# 1.獲取人的年齡print(jsonpath(dic, '$.person.age')) # 獲取到數(shù)據(jù)返回一個(gè)列表 否則返回False# 2.獲取第2個(gè)小狗的年齡print(jsonpath(dic, '$..dog[1].age'))# 3.獲取所有小狗的年齡print(jsonpath(dic, '$..dog[0,1].age'))print(jsonpath(dic, '$..dog[*].age'))# 4.獲取是VIP的小狗print(jsonpath(dic, '$..dog[?(@.isVIP)]'))# 5.獲取年齡大于2的小狗print(jsonpath(dic, '$..dog[?(@.age>2)]'))# 6.獲取最后一個(gè)小狗print(jsonpath(dic, '$..dog[-1:]'))print(jsonpath(dic, '$..dog[(@.length-1)]'))

上述代碼執(zhí)行結(jié)果如下:

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

案例二用到的字典如下:

book_dict = { 'store': { 'book': [ {'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95 }, {'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99 }, {'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99 }, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99 } ], 'bicycle': { 'color': 'red', 'price': 19.95 } }}

將上述抽象成一個(gè)樹形結(jié)構(gòu)如圖所示:

Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)

需求及結(jié)果如下:

JSONPath Result $.store.book[*].author store中的所有的book的作者 $.store[*] store下的所有的元素 $..price store中的所有的內(nèi)容的價(jià)格 $..book[2] 第三本書 $..book[(@.length-1)] 最后一本書 $..book[0:2] 前兩本書 $.store.book[?(@.isbn)] 獲取有isbn的所有書 $.store.book[?(@.price>10)] 獲取價(jià)格大于10的所有的書 $..* 獲取所有的數(shù)據(jù)

代碼如下:

from jsonpath import jsonpathbook_dict = { 'store': { 'book': [ {'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95 }, {'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99 }, {'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99 }, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99 } ], 'bicycle': { 'color': 'red', 'price': 19.95 } }}# 1.store中的所有的book的作者print(jsonpath(book_dict, '$.store.book[*].author'))print(jsonpath(book_dict, '$..author'))# 2.store下的所有的元素print(jsonpath(book_dict, '$.store[*]'))print(jsonpath(book_dict, '$.store.*'))# 3.store中的所有的內(nèi)容的價(jià)格print(jsonpath(book_dict, '$..price'))# 4.第三本書print(jsonpath(book_dict, '$..book[2]'))# 5.最后一本書print(jsonpath(book_dict, '$..book[-1:]'))print(jsonpath(book_dict, '$..book[(@.length-1)]'))# 6.前兩本書print(jsonpath(book_dict, '$..book[0:2]'))# 7.獲取有isbn的所有書print(jsonpath(book_dict, '$.store.book[?(@.isbn)]'))# 8.獲取價(jià)格大于10的所有的書print(jsonpath(book_dict, '$.store.book[?(@.price>10)]'))# 9.獲取所有的數(shù)據(jù)print(jsonpath(book_dict, '$..*'))5. Python專用JSON解析庫(kù)pickle

pickle處理的json對(duì)象不通用,可以額外的把函數(shù)給序列化。示例代碼如下:

import pickledef eat(): print('Amo在努力地寫博客~')person_info_dict = { 'name': 'Amo', 'age': 18, 'eat': eat}# print(pickle.dumps(person_info_dict))with open('pickle_json', 'wb') as file: pickle.dump(person_info_dict, file)with open('pickle_json', 'rb') as file: result = pickle.load(file) result['eat']()JsonPath與XPath語法對(duì)比:

Json結(jié)構(gòu)清晰,可讀性高,復(fù)雜度低,非常容易匹配,下表中對(duì)應(yīng)了XPath的用法。

XPath JSONPath 描述 / $ 根節(jié)點(diǎn) . @ 現(xiàn)行節(jié)點(diǎn) / .or[] 取子節(jié)點(diǎn) .. n/a 取父節(jié)點(diǎn),Jsonpath未支持 // .. 就是不管位置,選擇所有符合條件的條件 * * 匹配所有元素節(jié)點(diǎn) @ n/a 根據(jù)屬性訪問,Json不支持,因?yàn)镴son是個(gè)Key-value遞歸結(jié)構(gòu),不需要。 [] [] 迭代器標(biāo)示(可以在里邊做簡(jiǎn)單的迭代操作,如數(shù)組下標(biāo),根據(jù)內(nèi)容選值等) | [,] 支持迭代器中做多選。 [] ?() 支持過濾操作. n/a () 支持表達(dá)式計(jì)算 () n/a 分組,JsonPath不支持

到此這篇關(guān)于Python 解析庫(kù)json及jsonpath pickle的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 解析庫(kù)json及jsonpath pickle內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产区一区二区三 | 99爱在线精品视频免费观看9 | 中文字幕在线看视频一区二区三区 | 亚洲欧美韩日 | 日本视频在线免费播放 | 免费萌白酱国产一区二区三区 | 一区二区三区国产美女在线播放 | 亚洲欧美日韩综合在线一区二区三区 | 黄网在线观看免费网站台湾swag | 亚洲一区免费 | 99视频精品全部在线播放 | 乱人伦中文视频在线观看免费 | 欧美色成人综合 | 日韩一区二区三区视频 | 99精品在免费线视频 | 国产成人综合久久亚洲精品 | 欧美亚洲一区二区三区四 | 91精选视频在线观看 | 亚洲国产高清在线精品一区 | 999久久| 美国特级毛片 | 高清视频一区 | 农村寡妇偷毛片一级 | 视频精品一区二区三区 | 国产一区二区三区免费在线视频 | 欧美亚洲日本视频 | 日韩欧美日本 | 精品三级国产一区二区三区四区 | 亚洲精品一区二区三区五区 | 国产亚洲高清视频 | 夜夜操影院 | 亚洲小视频在线观看 | 欧美一区二区三区久久综 | 成人久久视频 | 国产成人亚洲精品91专区高清 | 高清国产精品久久久久 | 国产精品免费看久久久 | 成人在线91 | 欧美在线视频观看 | 免费观看国产精品 | 国产成人精品一区二区免费 |