Python3自定义json逐层解析器代码


Posted in Python onMay 11, 2020

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

代码如下:

# -*- 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"这个json拢共分{len(self.ret_j)}层")
    print("------")
    for lvl in self.ret_j:
      print(f"第{lvl}层解析")
      for root in self.ret_j[lvl]:
        print(f"解析内容:{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字符串。

设计思路:

Python3自定义json逐层解析器代码

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

如下所示:

import logging.config
from logging import LogRecord

# 通常用于Linux系统下,使控制台输出的日志带颜色
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', # 如果你的模块不是写在启动程序中,请将__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__)

运行效果图:

控制台:

Python3自定义json逐层解析器代码

文件:

3开头的写入到300_log.txt

4开头的写入到400_log.txt

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

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",这就导致过滤器返回False
logger.info("%s, %s, %s", status_code, website, link)

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

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

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

Python 相关文章推荐
打开电脑上的QQ的python代码
Feb 10 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
深入理解python中的atexit模块
Mar 07 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
python使用锁访问共享变量实例解析
Feb 08 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
Python中tqdm的使用和例子
Sep 23 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 #Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 #Python
Pycharm如何导入python文件及解决报错问题
May 10 #Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 #Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 #Python
python对接ihuyi实现短信验证码发送
May 10 #Python
python调用API接口实现登陆短信验证
May 10 #Python
You might like
在JavaScript中调用php程序
2009/03/09 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
在MAC上搭建python数据分析开发环境
2016/01/26 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
python实现Decorator模式实例代码
2018/02/09 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
求职者应聘的自我评价
2013/10/16 职场文书
文明风采获奖感言
2014/02/18 职场文书
物业经理自我鉴定
2014/03/03 职场文书
职业规划实施方案
2014/06/10 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
2015年信访工作总结
2015/04/07 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL