欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年08月17日 10:51:14   作者:Amo Xiang  
這篇文章主要介紹了Python 解析庫json及jsonpath pickle的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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繪制立方體的方法

    python繪制立方體的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制立方體的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 舉例講解Python中is和id的用法

    舉例講解Python中is和id的用法

    這篇文章主要介紹了舉例講解Python中is和id的用法,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),作者舉例進(jìn)行了簡單說明,需要的朋友可以參考下
    2015-04-04
  • Python tkinter實(shí)現(xiàn)春節(jié)煙花效果demo

    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的思考

    這篇文章主要介紹了對pytroch中torch.autograd.backward的思考,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • TensorFlow實(shí)現(xiàn)創(chuàng)建分類器

    TensorFlow實(shí)現(xiàn)創(chuàng)建分類器

    這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)創(chuàng)建分類器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法

    Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法

    今天小編就為大家分享一篇Python學(xué)習(xí)筆記之Django創(chuàng)建第一個(gè)數(shù)據(jù)庫模型的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python向MySQL批量插數(shù)據(jù)的實(shí)例講解

    Python向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)

    這篇文章主要介紹了使用TensorFlow-Slim進(jìn)行圖像分類的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 如何使用Pytorch搭建模型

    如何使用Pytorch搭建模型

    本來是只用Tenorflow的,但是因?yàn)門F有些Numpy特性并不支持,比如對數(shù)組使用列表進(jìn)行切片,所以只能轉(zhuǎn)戰(zhàn)Pytorch了(pytorch是支持的)。還好Pytorch比較容易上手,幾乎完美復(fù)制了Numpy的特性(但還有一些特性不支持),怪不得熱度上升得這么快。
    2020-10-10
  • opencv之顏色過濾只留下圖片中的紅色區(qū)域操作

    opencv之顏色過濾只留下圖片中的紅色區(qū)域操作

    這篇文章主要介紹了opencv之顏色過濾只留下圖片中的紅色區(qū)域操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論