Python零碎的总结—JSON文件的读写

记录平时使用python的一些小问题。

JSON文件

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。(百度百科)

JSON 示例:

{
	"info": "people test",
	"split": "train",
	"annotations": 
    [
        {
            "name": "stage1/train/61a4091324d1983534ca23b6f007f841.jpg",
            "id": 625,
            "num": 28,
            "ignore_region": [],
            "type": "bbox",
            "annotation": 
            [
                {
                    "y": 89,
                    "x": 28,
                    "w": 44,
                    "h": 164
                }, 
                {
                    "y": 75,
                    "x": 67,
                    "w": 42,
                    "h": 167
                },
                {
                    "y": 0,
                    "x": 636,
                    "w": 67,
                    "h": 98
                }, 
                {
                    "y": 102,
                    "x": 0,
                    "w": 38,
                    "h": 205
                }
            ]
	    }
    ]
}

如上图,为一个JSON 示例,是一个图片的标注数据。看上去就像python的字典一样,实际上也是按照字典处理的。

基本的概念

JSON建构于两种结构:

  • 名称/值”对的集合(Acollection of name/value pairs) 在python中就是理解为字典

名称/值’对”集合。以左括号 开始,右括号 结束 {........}。每个"名称"后跟一个:(冒号);“名称/值 对”之间使用,(逗号)分隔。

  • 值的有序列表(Anordered list of values) 就是一个数组,在python中使用list

数组是值(value)的有序集合。一个数组以"["(左中括号)开始,"]"(右中括号)结束。值之间使用","(逗号)分隔。

关于值的数据类型,可以是数值,数组,或者字典等。

遵从的规则:JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。
· 数据在名称/值对中
· 数据由逗号分隔
· 大括号保存对象
· 中括号保存数组

使用python 读取JSON 文件

首先 导入 import json

Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法:
dumps、dump、loads、load

dump函数
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, 
cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

参数说明

  • obj: 要序列化的对象。
  • fp: 文件描述符,将序列化的str保存到文件中。
  • skipkeys: 默认为False,如果skipkeys=True,将跳过不是基本类型(str,int,float,bool,None)dict键,不会引发TypeError
  • ensure_ascii: 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_asciiFalse,字符将按原样输出。
  • check_circular:默认值为True,如果check_circularFalse,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError
  • allow_nan: 默认值为True,如果allow_nanFalse,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nanTrue,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)
  • indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如“\t”),则该字符串用于缩进每个级别。
  • separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
  • default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError
  • sort_keys: 默认值为False,如果sort_keysTrue,则字典的输出将按键值排序。
dumps函数
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

参数说明

  • 显然dumps函数没有文件描述符参数,其他的参数和dump函数的一样。
load 和 loads

将json格式数据解码为python对象。
load函数:

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数说明

  • fp: 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象。
  • object_hook: 默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。
  • parse_float: 默认值为None,如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器。
  • parse_int: 默认值为None,如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器。
  • parse_constant:默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常。如果进行反序列化(解码)的数据不是一个有效的JSON文档,将会引发 JSONDecodeError异常。

loads函数:

json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数说明

  • s: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。
  • encoding: 指定一个编码的格式。
  • loads也不需要文件描述符,其他参数的含义和load函数的一致。

写JSON

import json
#把想写入的东西构建成一个字典,填数据据可以了
content = dict = {"name": "Tjk", "score": [23,34,45,66]}   
file='test.json'     
with open(file,'w',encoding='utf-8') as f:
    json.dump(content,f,indent=4)    #写入
    #f.write(json.dumps(dict, indent=4))
    print("加载入文件完成...")

结果:

json 写入mysql python_JSON

读JSON

import json
file='test.json'
data = {}
with open(file,'r',encoding='utf-8') as f:
    data_test = json.load(f)
    data = data_test
    print("data_test is",type(data_test))
print(data)
print(type(data.keys()))
key_list = list(data.keys())
print(key_list)
print(data[key_list[0]])
print(data[key_list[1]])

json 写入mysql python_python_02