Python 解析庫json及jsonpath pickle的實(shí)現(xiàn)
1. 數(shù)據(jù)抽取的概念
2. 數(shù)據(jù)的分類
3. JSON數(shù)據(jù)概述及解析
3.1 JSON數(shù)據(jù)格式
3.2 解析庫json
json模塊
是Python內(nèi)置標(biāo)準(zhǔn)庫,主要可以完成兩個(gè)功能:序列化和反序列化。JSON對象和Python對象映射圖如下:
3.2.1 json序列化
對象(字典/列表) 通過 json.dump()/json.dumps()
==> json字符串。示例代碼如下:
import json class Phone(object): def __init__(self, name, price): self.name = name self.price = price class 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:需要序列化的對象 字典/列表 這里指的是person_info_dict indent: 縮進(jìn) 單位: 字符 sort_keys: 是否按key排序 默認(rèn)是False不排序 cls: json.JSONEncoder子類 處理不能序列化的對象 ensure_ascii: 是否確保ascii編碼 默認(rèn)是True確保 "蘋果8plus"==>"\u82f9\u679c8plus" 所以改為False default: 對象不能被序列化時(shí),調(diào)用對應(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()
==> 對象(字典/列表),示例代碼如下:
import json class Phone(object): def __init__(self, name, price): self.name = name self.price = price def pi(num): return int(num) + 1 def oh(dic): if "price" in dic.keys(): return Phone(dic["name"], dic["price"]) return dic def 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: 對象解析鉤子函數(shù) 將字典轉(zhuǎn)為特定對象 傳遞給函數(shù)的是字典對象 # object_pairs_hook: 轉(zhuǎn)化為特定對象 傳遞的是元組列表 # 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) # 直接將文件對象傳入 print(type(result)) # <class 'dict'> print(result)
4. jsonpath
jsonpath
三方庫,點(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
或者:
4.1 使用
語法格式如下:
from jsonpath import jsonpath dic = {....} # 要找數(shù)據(jù)的字典 jsonpath(dic, 表達(dá)式)
常用的表達(dá)式語法如下:
JSONPath | 描述 |
---|---|
$ | 根節(jié)點(diǎn)(假定的外部對象,可以理解為上方的dic) |
@ | 現(xiàn)行節(jié)點(diǎn)(當(dāng)前對象) |
.或者[] | 取子節(jié)點(diǎn)(子對象) |
.. | 就是不管位置,選擇所有符合條件的節(jié)點(diǎn)(后代對象) |
* | 匹配所有元素節(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)如圖所示:
需求及結(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 jsonpath dic = { "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é)果如下:
案例二用到的字典如下:
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)如圖所示:
需求及結(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 jsonpath 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 } } } # 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解析庫pickle
pickle
處理的json對象不通用,可以額外的把函數(shù)給序列化。示例代碼如下:
import pickle def 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語法對比:
Json結(jié)構(gòu)清晰,可讀性高,復(fù)雜度低,非常容易匹配,下表中對應(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)示(可以在里邊做簡單的迭代操作,如數(shù)組下標(biāo),根據(jù)內(nèi)容選值等) |
| | [,] | 支持迭代器中做多選。 |
[] | ?() | 支持過濾操作. |
n/a | () | 支持表達(dá)式計(jì)算 |
() | n/a | 分組,JsonPath不支持 |
到此這篇關(guān)于Python 解析庫json及jsonpath pickle的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 解析庫json及jsonpath pickle內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python tkinter實(shí)現(xiàn)春節(jié)煙花效果demo
這篇文章主要為大家介紹了Python實(shí)現(xiàn)春節(jié)煙花效果demo,本文為大家提供了兩種實(shí)現(xiàn)方式代碼,詳細(xì)的實(shí)現(xiàn)一場浪漫的煙花秀,有需要的朋友可以借鑒參考下2024-01-01淺談對pytroch中torch.autograd.backward的思考
這篇文章主要介紹了對pytroch中torch.autograd.backward的思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12TensorFlow實(shí)現(xiàn)創(chuàng)建分類器
這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)創(chuàng)建分類器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法
今天小編就為大家分享一篇Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python向MySQL批量插數(shù)據(jù)的實(shí)例講解
下面小編就為大家分享一篇Python向MySQL批量插數(shù)據(jù)的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03使用TensorFlow-Slim進(jìn)行圖像分類的實(shí)現(xiàn)
這篇文章主要介紹了使用TensorFlow-Slim進(jìn)行圖像分類的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12