当前位置: 移动技术网 > IT编程>脚本编程>Python > Python 中JSON数据的读写

Python 中JSON数据的读写

2019年04月25日  | 移动技术网IT编程  | 我要评论

成州,野钓鲫鱼技巧,初次与你相遇韩语版

前言

  • json(javascript object notation,javascript对象表示法)是一种轻量级的数据交换语言

  • json是独立于语言的文本格式, json 数据格式与语言无关

  • json 数据格式的特点:
    • 对象表示为键值对
    • 数据由逗号分隔
    • 花括号保存对象
      • 对象一个对象包含一系列非排序的名称/值对,一个对象以{开始,并以}结束。每个名称/值对之间使用:分割
    • 方括号保存数组,
      • 数组一个数组是一个值的集合,一个数组以[开始,并以]结束。数组成员之间使用,分割

json 数据的读取

首先, 我们需要导入模块

 import json

读取json数据, json模块提供了两个方法loads、load,都是实现“反序列化”, 那么,两者有和区别呢,对比如下:

 def load(fp, *, cls=none, object_hook=none, parse_float=none,
        parse_int=none, parse_constant=none, object_pairs_hook=none, **kw)
        
  """deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a json document) to a python object.""" 
def loads(s, *, encoding=none, cls=none, object_hook=none, parse_float=none,
        parse_int=none, parse_constant=none, object_pairs_hook=none, **kw)
        
    """deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
    containing a json document) to a python object."""

由此不难看出, load需要传入一个文件对象, 而loads需要的是一个内存对象

现在有一文件 数据内容如下:

  {
    "id": "2016984", 
    "title": "标题2", 
    "publish_data": "2019/4/15", 
    "publish_place": "广州", 
    "software": "boss",
    "skill": ["go", "ruby", "java", "python"]
}

现在就分别使用load和loads读取data.json里面的内容并打印出来

    with open('datas.json', 'r', encoding='utf-8') as fo:
        d= json.load(fo)
    print(d, type(d))
        
    print('-'*150) # 分割一下好区分
    
    with open('datas.json', 'r', encoding='utf-8') as fo:
        '''
            因为loads需要传入的是一个内存对象,所以
            要先暂时保存到内存中, 再使用loads进行
            数据的读取操作
        '''
        data = fo.read()
        d2= json.loads(data)  
    print(d2, type(d2))

打印效果如下:

json 数据的写入

json模块同时也提供了两个写入的方法dump和dumps, 如下:

def 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):
    """serialize ``obj`` as a json formatted stream to ``fp`` (a
    ``.write()``-supporting file-like object)."""
def 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):
    """serialize ``obj`` to a json formatted ``str``."""

其实两个和读取大同小异, 都是需要的对象不一样.

那么, 这里有一个数据:

    data = {
        'id': '2016982',
        'title': '标题1',
        'publish_data': '2019/4/15',
        'publish_place': '深圳',
        'software': 'lg',
    }

分别用dump和dumps来进行文件的写入

    with open('datas.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=false, indent=4, separators=(', ', ': '))

    with open('datas.json', 'w', encoding='utf-8') as f:
        # 将字典格式化为字符串对象
        f.write(json.dumps(data2, ensure_ascii=false, indent=4, separators=(', ', ': ')))

写入完毕之后就会得到一个文件datas.json, 内容如下:

{
        'id': '2016982',
        'title': '标题1',
        'publish_data': '2019/4/15',
        'publish_place': '深圳',
        'software': 'lg',
    }

方法中每个参数的作用

参数 作用
skipkeys 如果 skipkeys 是 true (默认为 false),那么那些不是基本对象(包括 str, int、float、bool、none)的字典的键会被跳过;否则引发一个 typeerror。
ensure_ascii 如果 ensure_ascii 是 true (即默认值),输出保证将所有输入的非 ascii 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出。
check_circular 如果 check_circular 是为假值 (默认为 true),那么容器类型的循环引用检验会被跳过并且循环引用会引发一个 overflowerror (或者更糟的情况)。
allow_nan 如果 allow_nan 是 false(默认为 true),那么在对严格 json 规格范围外的 float 类型值(nan、inf 和 -inf)进行序列化时会引发一个 valueerror。如果 allow_nan 是 true,则使用它们的 javascript 等价形式(nan、infinity 和 -infinity)。
indent 如果 indent 是一个非负整数或者字符串,那么 json 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。none(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如"\t"),那个字符串会被用于缩进每一层。
separators 当指定时,separators 应当是一个 (item_separator, key_separator) 元组。当 indent 为 none 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 json 表达式,你应该指定其为 (',', ':') 以消除空白字符。
sort_keys 如果 sort_keys 是 true(默认为 false),那么字典的输出会以键的顺序排序。
object_hook object_hook 是一个可选的函数,它会被调用于每一个解码出的对象字面量(即一个 dict)。object_hook 的返回值会取代原本的 dict。这一特性能够被用于实现自定义解码器(如 json-rpc 的类型提示)。

注:以上参数内容来自官方文档,

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网