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 相关文章推荐
跟老齐学Python之不要红头文件(2)
Sep 28 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
Python的Django框架中的表单处理示例
Jul 17 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
python的mysqldb安装步骤详解
Aug 14 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 Python
如何理解python接口自动化之logging日志模块
Jun 15 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
php操作mongoDB实例分析
2014/12/29 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
python设计模式大全
2016/06/27 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
python全栈开发语法总结
2020/11/22 Python
司马光教学反思
2014/02/01 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
安全隐患整改报告
2014/11/06 职场文书
处罚决定书范文
2015/06/24 职场文书
教务处教学工作总结
2015/08/10 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers