【Python3.5】读写JSON格式的数据

简介: 打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处: 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.html
http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

相关文章
|
23天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
21天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
1月前
|
传感器 物联网 开发者
使用Python读取串行设备的温度数据
本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
53 3
|
1月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
31 1
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
1月前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
81 0
|
2月前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
78 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
Python
python读写操作excel日志
主要是读写操作,创建表格
68 2