python代码解读器_Python3自定义json逐层解析器代码

本文介绍了一个Python3实现的自定义JSON解析器,可以逐层解析JSON内容,通过实例展示了如何解析中国天气网接口返回的数据。此外,还讲解了Python logging模块的使用,包括自定义日志格式、过滤器,以及日志写入不同文件的配置方法。
摘要由CSDN通过智能技术生成

用python3对json内容逐层进行解析,拿中国天气网的接口返回数据测试,

代码如下:

# -*- coding: utf-8 -*-

importoperator as op

fromcollections importdefaultdict

classJson(object):

def__init__(self, json: str):

sth =eval(json)

load =lambdasth: sth ifop.eq(type(sth).__name__, dict.__name__) elseNone

self.json_dict =load(sth)

self.ret_j =defaultdict(dict)

self.analyze(self.json_dict)

defanalyze(self, j_dict: dict, lvl=0) -> None:

lvl +=1

fork inj_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}")

ifop.eq(v_type.__name__, dict.__name__):

self.analyze(v, lvl)

elifop.eq(v_type.__name__, list.__name__):

foreach inv:

ifop.eq(type(each).__name__, dict.__name__):

self.analyze(each, lvl)

defget_analysis(self) -> None:

print(f"这个json拢共分{len(self.ret_j)}层")

print("------")

forlvl inself.ret_j:

print(f"第{lvl}层解析")

forroot inself.ret_j[lvl]:

print(f"解析内容:{root}")

foreach inself.ret_j[lvl][root]:

print(each)

print("------")

if__name__ =='__main__':

try:

importrequests

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字符串。

设计思路:

补充知识:python之logging模块:将不同的日志写入到不同的文件

如下所示:

importlogging.config

fromlogging importLogRecord

# 通常用于Linux系统下,使控制台输出的日志带颜色

classColorFormatter(logging.Formatter):

log_colors ={

'CRITICAL': '\033[0;31m',

'ERROR': '\033[0;33m',

'WARNING': '\033[0;35m',

'INFO': '\033[0;32m',

'DEBUG': '\033[0;00m',

}

defformat(self, record: LogRecord) -> str:

s =super().format(record)

level_name =record.levelname

iflevel_name inself.log_colors:

returnself.log_colors[level_name] +s +'\033[0m'

returns

classMyFilter400(logging.Filter):

deffilter(self, record: LogRecord):

ifrecord.msg.startswith("4"):

returnTrue

returnFalse

classMyFilter300(logging.Filter):

deffilter(self, record: LogRecord):

ifrecord.msg.startswith("3"):

returnTrue

returnFalse

LOG_LEVEL =logging.INFO

LOGGER ={

'version': 1,

'disable_existing_loggers': True,

'formatters': {

'color': {

'class': '__main__.ColorFormatter', # 如果你的模块不是写在启动程序中,请将__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__)

运行效果图:

控制台:

文件:

3开头的写入到300_log.txt

4开头的写入到400_log.txt

特别注意,使用过滤器的一个问题

classMyFilter400And500(logging.Filter):

deffilter(self, record: LogRecord):

ifrecord.msg.startswith("4") orrecord.msg.startswith("5"):

returnTrue

returnFalse

# record.msg = "404, %s, %s"

logger.info(f"{status_code}, %s, %s", website, link)

# record.msg = "%s, %s, %s",这就导致过滤器返回False

logger.info("%s, %s, %s", status_code, website, link)

因此,如果发现消息没有写入文件,可能是消息格式的问题。

目前,官方推荐字符串格式化的方式就是第一种方式,%s和.format()的方式都不如这个好。

以上这篇Python3自定义json逐层解析器代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值