设为首页 收藏本站
查看: 650|回复: 0

[经验分享] Python保存json文件并格式化

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-27 18:41:08 | 显示全部楼层 |阅读模式
最近自己python开发一些小东西,需要用json文件存储些文件属性什么的,但是发现用 json 包里的 json.dump() 方法存json文件的效果好丑……(其实是没仔细看方法), 于是上网找了一份格式化json文件的代码,效果挺不错,用了递归的思想,学习了一波并找到了其中一点小bug。然后,发现其实 json.dump() 方法其实只需要设置一个参数就达到格式化的效果了……
  下面介绍一下 json.dump() 和我 修改后的那份代码
  json.dump()
  直接把常用参数列一下好了
QQ截图20160818233621.png
也就是说在使用 json.dump() 的时候设置一下 indent 参数的值就好了。比如 json.dump(json_dict, f, indent=4) ,加与不加的区别如下:
  {"title_pinyin":"gywxw","title":"隔云勿相望","url":"http://www.ty2016.net/book/gywxw/","description":"大学刚毕业,她嫁给了林安森可是结婚三年,电视上常看到他出席各种场合携女相伴,她却再没再亲眼见过他。"}
  {
  "title_pinyin":"gywxw",
  "title":"隔云勿相望",
  "url":"http://www.ty2016.net/book/gywxw/",
  "description":"大学刚毕业,她嫁给了林安森可是结婚三年,电视上常看到他出席各种场合携女相伴,她却再没再亲眼见过他。"
  }
  递归实现
  直接粘过来了,不难理解,效果跟上边是一样的。
  # -*- encoding: utf-8 -*-
  class JsonFormatter:
  def __init__(self, intend=4, name="", encoding="utf-8"):
  '''
  intend: 缩进空格数
  name: 文件名
  encoding: 文件编码
  '''
  self.name = name
  self.intend = intend
  self.encoding = encoding
  self.stack = []
  self.obj = None
  self.source = self.get_source(name, self.encoding)
  self.prepare()
  @staticmethod
  def json_str(s):
  '''
  给字符串套上双引号
  '''
  return '"' + s + '"'
  @staticmethod
  def get_source(name, encoding="utf-8"):
  with open(name, 'r', encoding=encoding) as f:
  # 当不给split函数传递任何参数时,分隔符sep会采用任意形式的空白字符:空格、tab、换行、回车以及换页符
  return ''.join(f.read().split())
  def prepare(self):
  try:
  # python对象和json格式还是略有不同
  self.source = self.source.replace("null", "None").replace("true", "True").replace("false", "False")
  self.obj = eval(self.source)
  except:
  # json string 一定满足python dictlist的组合
  raise Exception('Invalid json string!')
  def line_intend(self, level=0):
  return '\n' + ' ' * self.intend * level
  def parse_dict(self,obj=None,intend_level=0):
  if intend_level == 0:
  # 这个判断是为了防止文件开头出现空行
  self.stack.append('{')
  else:
  self.stack.append(self.line_intend(intend_level)+'{')
  intend_level += 1
  i = 0
  for key, value in obj.items():
  key = self.json_str(str(key))
  self.stack.append(self.line_intend(intend_level)+key+':')
  self.parse(value, intend_level)
  if i != len(obj.items())-1:
  # 这个处理是为了防止最后一对kv后面还有个逗号,这样会造成json.load()函数无法读取
  self.stack.append(',')
  i += 1
  self.stack.append(self.line_intend(intend_level-1)+'}')
  def parse_list(self, obj=None, intend_level=0):
  if intend_level == 0:
  self.stack.append('[')
  else:
  self.stack.append(self.line_intend(intend_level)+'[')
  intend_level += 1
  for i, item in zip(range(0, len(obj)), obj):
  self.parse(item, intend_level)
  if i != len(obj)-1:
  self.stack.append(',')
  self.stack.append(self.line_intend(intend_level-1)+']')
  def parse(self, obj, intend_level=0):
  if obj is None:
  self.stack.append('null')
  elif obj is True:
  self.stack.append('true')
  elif obj is False:
  self.stack.append('false')
  elif isinstance(obj, (int, float)):
  self.stack.append(str(obj))
  elif isinstance(obj, str):
  self.stack.append(self.json_str(obj))
  elif isinstance(obj, (list, tuple)):
  self.parse_list(obj, intend_level)
  elif isinstance(obj, dict):
  self.parse_dict(obj, intend_level)
  else:
  raise Exception('Invalid json type %s!' % obj)
  def render(self):
  self.parse(self.obj, 0)
  res_file = self.name
  res = ''.join(self.stack)
  with open(res_file, 'w', encoding=self.encoding) as f:
  f.write(res)
  if __name__ == "__main__":
  jf = JsonFormatter(name="json.txt")
  jf.render()
来源:孔天逸'Blog


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348034-1-1.html 上篇帖子: Python自动化运维基础视频 下篇帖子: Python错误和异常概念
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表