Python3自定義json逐層解析器代碼
用python3對(duì)json內(nèi)容逐層進(jìn)行解析,拿中國(guó)天氣網(wǎng)的接口返回?cái)?shù)據(jù)測(cè)試,
代碼如下:
# -*- coding: utf-8 -*-
import operator as op
from collections import defaultdict
class Json(object):
def __init__(self, json: str):
sth = eval(json)
load = lambda sth: sth if op.eq(type(sth).__name__, dict.__name__) else None
self.json_dict = load(sth)
self.ret_j = defaultdict(dict)
self.analyze(self.json_dict)
def analyze(self, j_dict: dict, lvl=0) -> None:
lvl += 1
for k in j_dict:
v = j_dict[k]
v_type = type(v)
try:
self.ret_j[lvl][str(j_dict)].append(f"{k}:{v}")
except:
self.ret_j[lvl][str(j_dict)] = []
self.ret_j[lvl][str(j_dict)].append(f"{k}:{v}")
if op.eq(v_type.__name__, dict.__name__):
self.analyze(v, lvl)
elif op.eq(v_type.__name__, list.__name__):
for each in v:
if op.eq(type(each).__name__, dict.__name__):
self.analyze(each, lvl)
def get_analysis(self) -> None:
print(f"這個(gè)json攏共分{len(self.ret_j)}層")
print("------")
for lvl in self.ret_j:
print(f"第{lvl}層解析")
for root in self.ret_j[lvl]:
print(f"解析內(nèi)容:{root}")
for each in self.ret_j[lvl][root]:
print(each)
print("------")
if __name__ == '__main__':
try:
import requests
except:
exit(0)
url = "http://forecast.weather.com.cn/napi/h5map/city/101/jQuery1533133004035?callback=jQuery1533133004035"
r = requests.get(url)
d_r = r.content.decode()
json_4_test = d_r[d_r.index("(") + 1:d_r.index(")")]
Json(json_4_test).get_analysis()
其中json_4_test是待解析的json字符串。
設(shè)計(jì)思路:

補(bǔ)充知識(shí):python之logging模塊:將不同的日志寫入到不同的文件
如下所示:
import logging.config
from logging import LogRecord
# 通常用于Linux系統(tǒng)下,使控制臺(tái)輸出的日志帶顏色
class ColorFormatter(logging.Formatter):
log_colors = {
'CRITICAL': '\033[0;31m',
'ERROR': '\033[0;33m',
'WARNING': '\033[0;35m',
'INFO': '\033[0;32m',
'DEBUG': '\033[0;00m',
}
def format(self, record: LogRecord) -> str:
s = super().format(record)
level_name = record.levelname
if level_name in self.log_colors:
return self.log_colors[level_name] + s + '\033[0m'
return s
class MyFilter400(logging.Filter):
def filter(self, record: LogRecord):
if record.msg.startswith("4"):
return True
return False
class MyFilter300(logging.Filter):
def filter(self, record: LogRecord):
if record.msg.startswith("3"):
return True
return False
LOG_LEVEL = logging.INFO
LOGGER = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'color': {
'class': '__main__.ColorFormatter', # 如果你的模塊不是寫在啟動(dòng)程序中,請(qǐng)將__main__更換成你模塊的路徑,下同
'format': '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
},
'default': {
'class': 'logging.Formatter',
'format': '%(message)s'
}
},
'filters': {
'filter_400': {
'()': '__main__.MyFilter400'
},
'filter_300': {
'()': '__main__.MyFilter300'
}
},
'handlers': {
'console': {
'level': LOG_LEVEL,
'class': 'logging.StreamHandler',
'formatter': 'color',
},
'file1': {
'level': LOG_LEVEL,
'class': 'logging.FileHandler',
'mode': 'w',
'formatter': 'default',
'filename': '400_log.txt',
'encoding': 'utf-8',
'filters': ['filter_400']
},
'file2': {
'level': LOG_LEVEL,
'class': 'logging.FileHandler',
'mode': 'w',
'formatter': 'default',
'filename': '300_log.txt',
'encoding': 'utf-8',
'filters': ['filter_300']
},
},
'loggers': {
'__main__': {
'handlers': ['file1', 'file2', 'console'],
'level': LOG_LEVEL,
},
}
}
logging.config.dictConfig(LOGGER)
logger = logging.getLogger(__name__)
logger.debug('200,this is a logger debug message')
logger.info('302,this is a logger info message')
logger.warning('301,this is a logger warning message')
logger.error('404,this is a logger error message')
logger.critical('500,this is a logger critical message')
print("%s" % __name__)
運(yùn)行效果圖:
控制臺(tái):

文件:
3開(kāi)頭的寫入到300_log.txt
4開(kāi)頭的寫入到400_log.txt
特別注意,使用過(guò)濾器的一個(gè)問(wèn)題
class MyFilter400And500(logging.Filter):
def filter(self, record: LogRecord):
if record.msg.startswith("4") or record.msg.startswith("5"):
return True
return False
# record.msg = "404, %s, %s"
logger.info(f"{status_code}, %s, %s", website, link)
# record.msg = "%s, %s, %s",這就導(dǎo)致過(guò)濾器返回False
logger.info("%s, %s, %s", status_code, website, link)
因此,如果發(fā)現(xiàn)消息沒(méi)有寫入文件,可能是消息格式的問(wèn)題。
目前,官方推薦字符串格式化的方式就是第一種方式,%s和.format()的方式都不如這個(gè)好。
以上這篇Python3自定義json逐層解析器代碼就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python3 json模塊之編碼解碼方法講解
- Python3中對(duì)json格式數(shù)據(jù)的分析處理
- python3實(shí)現(xiàn)從kafka獲取數(shù)據(jù),并解析為json格式,寫入到mysql中
- python3 實(shí)現(xiàn)的對(duì)象與json相互轉(zhuǎn)換操作示例
- python3 json數(shù)據(jù)格式的轉(zhuǎn)換(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互轉(zhuǎn)換)
- Python3爬蟲爬取百姓網(wǎng)列表并保存為json功能示例【基于request、lxml和json模塊】
- Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫入MySQL數(shù)據(jù)庫(kù)的方法
- Python3實(shí)現(xiàn)的字典、列表和json對(duì)象互轉(zhuǎn)功能示例
- 解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題
- Python3內(nèi)置json模塊編碼解碼方法詳解
相關(guān)文章
使用sklearn進(jìn)行對(duì)數(shù)據(jù)標(biāo)準(zhǔn)化、歸一化以及將數(shù)據(jù)還原的方法
今天小編就為大家分享一篇使用sklearn進(jìn)行對(duì)數(shù)據(jù)標(biāo)準(zhǔn)化、歸一化以及將數(shù)據(jù)還原的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python實(shí)現(xiàn)簡(jiǎn)單文本字符串處理的方法
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單文本字符串處理的方法,涉及Python針對(duì)文本字符串的切割、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
多個(gè)版本的python共存時(shí)使用pip的正確做法
這篇文章主要介紹了多版本python共存時(shí)使用pip的正確做法,幫助有多個(gè)python版本需求的人可以正確的導(dǎo)包,感興趣的朋友可以了解下2020-10-10
Python機(jī)器學(xué)習(xí)應(yīng)用之基于決策樹算法的分類預(yù)測(cè)篇
所謂決策樹,就是一個(gè)類似于流程圖的樹形結(jié)構(gòu),樹內(nèi)部的每一個(gè)節(jié)點(diǎn)代表的是對(duì)一個(gè)特征的測(cè)試,樹的分支代表該特征的每一個(gè)測(cè)試結(jié)果,而樹的每一個(gè)葉子節(jié)點(diǎn)代表一個(gè)類別。樹的最高層是就是根節(jié)點(diǎn)2022-01-01
python中將正則過(guò)濾的內(nèi)容輸出寫入到文件中的實(shí)例
今天小編就為大家分享一篇python中將正則過(guò)濾的內(nèi)容輸出寫入到文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python中使用kitti數(shù)據(jù)集實(shí)現(xiàn)自動(dòng)駕駛(繪制出所有物體的行駛軌跡)
這篇文章主要介紹了Python中使用kitti數(shù)據(jù)集實(shí)現(xiàn)自動(dòng)駕駛——繪制出所有物體的行駛軌跡,本次內(nèi)容主要是畫出kitti車的行駛的軌跡,需要的朋友可以參考下2022-06-06
Python openpyxl讀取單元格字體顏色過(guò)程解析
這篇文章主要介紹了Python openpyxl讀取單元格字體顏色過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
盤點(diǎn)十個(gè)超級(jí)好用的高級(jí)Python腳本
這篇文章主要介紹了盤點(diǎn)十個(gè)超級(jí)好用的高級(jí)Python腳本,我們經(jīng)常會(huì)遇到一些大小問(wèn)題,其中有很多的問(wèn)題,都是可以使用一些簡(jiǎn)單的Python代碼就能解決,需要的朋友可以參考下2023-04-04
python實(shí)現(xiàn)最大子序和(分治+動(dòng)態(tài)規(guī)劃)
這篇文章主要介紹了python實(shí)現(xiàn)最大子序和(分治+動(dòng)態(tài)規(guī)劃),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
一文實(shí)現(xiàn)刪除numpy數(shù)組中的指定索引元素
在Python中,Numpy是一個(gè)強(qiáng)大的數(shù)學(xué)庫(kù),用于處理大型多維數(shù)組和矩陣的數(shù)學(xué)運(yùn)算,數(shù)組是由相同類型的數(shù)據(jù)元素組成的集合,并且每個(gè)元素都可以通過(guò)索引進(jìn)行訪問(wèn),本文將給大家介紹如何刪除numpy數(shù)組中的指定索引元素,需要的朋友可以參考下2024-05-05

