最近自己用python开发一些小东西,需要用json文件存储些文件属性什么的,但是发现用 json 包里的 json.dump() 方法存json文件的效果好丑……(其实是没仔细看方法), 于是上网找了一份格式化json文件的代码,效果挺不错,用了递归的思想,学习了一波并找到了其中一点小bug。然后,发现其实 json.dump() 方法其实只需要设置一个参数就达到格式化的效果了…… 下面介绍一下 json.dump() 和我 修改后的那份代码。 json.dump() 直接把常用参数列一下好了 也就是说在使用 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 dict和list的组合 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 |
Python保存json文件并格式化
时间: 2024-11-03 22:48:30
Python保存json文件并格式化的相关文章
python解析json文件
概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象. JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集. Python2.6开始加入了JSON模块,无需另外下载,Python的Json模
Python 基础 - Json文件读写
JSON介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). 在python中,JSON 由列表和字典组成. 序列化的两个模块中,json模块是用于
ajaxSubmit 上传成功 保存json文件 问题解决
客户要求上传文件同时对返回结果在js中要做处理,发现ajaxform还挺好用的,然后一直在firefox测试都没什么问题, 可是在IE浏览器中执行就提示我保存json文件而没有走我success的方法,网上有说要设置返回格式的类型为text/html可是我的还是不能通过. 然后我就在官网上下了一个最新的试试,引入我最新的js执行,完美通过,高版本就是好一点,兼容性好.BUG率少
【Python】Python处理Json文件
最近用到Python来处理Json文件,对Python的Json模块熟悉了一下,下面是一个简单的程序用Python的Json模块来处理Json文件并写到一个新的Json文件中去,希望对大家有所帮助. 1.问题描述: 需要加载一个Json文件,并将Json中的某些项进行修改,然后写回到一个新的Json文件中去. 程序代码如下:test.py import json #导入Json模块 def processJson(inputJsonFile, outputJsonFile): fin = ope
使用Python对json文件进行处理
本文主要介绍如何使用Python读取json文件并将内容编码为json格式,对于json数据的具体处理方法并没有介绍. #!/usr/bin/env python #-*- encoding: gbk -*- import string,time import json j_file=open("1.json","r") lines="a" while 1: lines = j_file.readline().strip("\n&quo
python中json文件处理涉及的四个函数json.dumps()和json.loads()、json.dump()和json.load()的区分
一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串) (2)json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典) 2.json.dump()和json.load()主要用来读写json文件函数 二.代
python读取json文件存sql及codecs读取大文件问题
preface: 最近帮师兄处理json文件,需要读到数据库里面,以备其后续从数据库读取数据.数据是关于yelp网站里面的: https://github.com/Yelp/dataset-examples,http://www.yelp.com/dataset_challenge/. 涉及到一些json和sql的问题,记录下. 一.python sql安装 python 自带轻型数据库sqlite,不过用不了.需要mysql才行,pip安装mysql失败,easy_install安装也失败,这
python读取json文件报 No JSON object could be decoded
def load(): with open('D:\\jiance.geojson') as json_file: data = json.load(json_file) return data 代码如上,读取json并load时报错: No JSON object could be decoded 解决方法: 可用Nodepad++将json文件打开并以UTF8无BOM格式保存,然后再次读取
python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串) json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数