Python保存json文件并格式化


最近自己用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

时间: 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()函数