【Python3.5】读写JSON格式的数据
2016-12-14 00:29
645 查看
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
写在前边的话
由于最近在玩ELK数据分析,慢慢的对JSON格式的数据有了一些了解,之前只知道JSON是Javascript Object Notation编码格式的数据,且在web开发中的前后端数据传输时会大部分用的都是json格式的数据,那么接下来我们就好好看看python 对于 json格式数据的操作吧本文永久地址:【python3.5】 读写JSON格式的数据
Json快速入门
json模块提供了一种很简单的方式来编码和解码json格式的数据,其中两个主要的函数是json.dumps()和json.loads(),当然与之对应的还要json.dump()和json.load()函数,下边先看几个例子帮你快速理解json将一个Python数据结构转化为json:
import json data ={ 'name': 'thinkgamer', 'age': 23, 'sex': 'men' } json_str = json.dumps(data) type(json_str) #<class 'str'> type(data) #<class 'dict'>
将一个JSON编码的字符串转换回一个Python数据结构:
new_data = json.loads(json_str) type(new_data) #<class 'dict'>
上边演示的是json.dumps()函数和json.loads()函数,但是如果你的操作对象是文件而不仅是python的数据结构呢,这个时候就要用到json.dump()和json.load()了。
>>> new_data = json.loads(json_str) >>> type(new_data) <class 'dict'> >>> with open("data.json","w") as fw: ... json.dump(data,fw) ... >>> import os >>> os.system("cat data.json") {"age": 23, "name": "thinkgamer", "sex": "men"}0 >>> with open("data.json","r") as fr: ... data = json.load(fr) ... print(data) ... print(type(data)) ... {'age': 23, 'name': 'thinkgamer', 'sex': 'men'} <class 'dict'>
四个函数解释
json.dump()
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
将obj序列化为JSON格式流到fp
如果skipkeys为True (默认:False),然后并不是一种基本的类型 (str, unicode, int, long, float, bool, None) 的字典键将被跳过而不是抛出TypeError异常。
如果ensure_ascii为True(默认值),则输出中的所有非ASCII字符都将使用uXXXX序列进行转义,并且结果是仅由ASCII字符组成的str实例。 如果ensure_ascii为False,写入fp的一些块可能是unicode实例。 这通常发生,因为输入包含unicode字符串或使用encoding参数。 除非fp.write()明确理解unicode(如codecs.getwriter()),这很可能导致错误。
如果check_circuler设置为false(默认为true)对容器类型的循环引用检查将被跳过,然后循环的引用将导致OverflowError。
若allow_nan为False(默认:True),那么它将是ValueError范围的浮点型值-inf inf nan) 从序列化 JSON 的规范,而不是使用 JavaScript 等价物严格按照 (NaN,无穷大, -无限)。
cls:如果缩进是一个非负整数,那么 JSON 数组元素和对象成员将漂亮印有该缩进级别。缩进级别为 0,或负面的只能将插入换行符。没有一个(默认值) 选择的最紧凑的表示形式。
indent:如果分隔符是(item_separator, dict_separator)元组),那么它将代替默认的(‘, ‘, ‘: ‘)分隔符。 (‘,’, ‘: ‘)是最紧凑的 JSON 表示
encoding:编码的字符编码为 str 实例,默认为 utf-8
default(obj)是 obj 的一个函数,它应该返回一个可序列化的版本或提高TypeError。默认值只是引发TypeError。
如果sort_keys为True (默认:False),然后将按关键字排序字典的输出。
json.dumps()
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
将Python的对象数据或者是str序列化为JSON格式,具体的参数含义如dump()函数
json.load()
json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
反序列化fp ( .read()-支持文件类似对象包含一个 JSON 文档) 到 Python 对象
object_hook:可选函数,将调用任何对象文本解码的结果
object_pairs_hook:可选函数,将调用任何的结果对象文本解码成对有序列表
parse_float:如果指定,将使用每个 JSON float要解码的字符串调用。默认情况下,这是相当于float(num_str)。这可以用来使用另一种数据类型或解析 JSON float
parse_int:如果指定,将使用每个 JSON int 要解码的字符串调用。默认情况下,这是相当于int(num_str)。这可以用来使用另一种数据类型或解析 JSON 整数
parse_constant,如果指定,将调用以下字符串之一: ‘-无穷大 ‘, ‘无穷大’、 ‘null’。如果遇到无效的 JSON 格式时引发异常。
json.loads()
将包含json格式的文档序列化成Python的对象,其余参数同load()函数几个小案例
一般来讲,JSON解码会根据提供的数据创建dicts或lists。 如果你想要创建其他类型的对象,可以给 json.loads() 传递object_pairs_hook或object_hook参数。 例如,下面是演示如何解码JSON数据并在一个OrderedDict中保留其顺序的例子>>> import os >>> s= '{"name":"Think","share":50, "price":12}' >>> from collections import OrderedDict >>> data = json.loads(s, object_pairs_hook=OrderedDict) >>> data OrderedDict([('name', 'Think'), ('share', 50), ('price', 12)]) >>> type(data) <class 'collections.OrderedDict'>
将一个JSON字典转换为一个Python对象例子
>>> class json_object: ... def __init__(self,d): ... self.__dict__ = d ... >>> data = json.loads(s, object_hook = json_object) >>> data.name 'Think' >>> data.share 50 >>> data.price 12
在这个例子中,JSON解码后的字典作为一个单个参数传递给 init() 。 然后,你就可以随心所欲的使用它了,比如作为一个实例字典来直接使用它。
在编码JSON的时候,还有一些选项很有用。 如果你想获得漂亮的格式化字符串后输出,可以使用 json.dumps() 的indent参数。 比如:
>>> print(json.dumps(data)) {"name": "Think", "shares": 50, "price": 12} >>> print(json.dumps(data,indent=4)) { "name": "Think", "shares": 50, "price": 12 }
然而实例通常并不是可序列化的,例如
>>> class Point: ... def __init__(self,x,y): ... self.x = x ... self.y = y ... >>> p = Point(2,3) >>> json.dumps(p) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.5/json/__init__.py", line 230, in dumps return _default_encoder.encode(obj) File "/usr/lib/python3.5/json/encoder.py", line 198, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode return _iterencode(o, 0) File "/usr/lib/python3.5/json/encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <__main__.Point object at 0x7f2757f2f278> is not JSON serializable
如果你想序列化对象实例,你可以提供一个函数,它的输入是一个实例,返回一个可序列化的字典。例如:
>>> def serialize_instance(obj): ... d = { '__classname__' : type(obj).__name__} ... d.update(vars(obj)) ... return d ... >>> p = Point(2,3) >>> json.dumps(p,default =serialize_instance) '{"x": 2, "y": 3, "__classname__": "Point"}'
资料参考
http://python.usyiyi.cn/python_278/library/json.htmlhttp://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html
相关文章推荐
- Python数据读写操作-json格式的台风数据
- Python爬取Json格式数据并读写(改中文编码)
- Python读写json格式文件
- Python--- 如何在Django中接收JSON格式的数据
- python 读写JSON数据
- 测试比json更快更小的二进制数据传输格式Msgpack [pythono MessagePack 版本] - 峰云,就她了。 - 51CTO技术博客
- python使用json格式进行数据封装
- Python怎么读写json格式文件
- python将json格式的数据转换成文本格式的数据或sql文件
- Android读写JSON格式的数据之JsonWriter和JsonReader
- python 把数据 json格式输出
- Python中json格式数据的编码和解码
- python使用json格式进行数据封装
- Python中json格式数据的编码和解码
- python——使用yaml数据格式,PK --> XML,JSON
- python开发_json_一种轻量级的数据交换格式
- python 打印json格式的数据中文显示问题
- python使用json格式进行数据封装
- [Android基础]读写xml、json格式的数据
- Spark处理Json格式数据(Python)