• Python 3 操作json 文件


    背景

    json 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。

    一般表现形式是一个无序的 键值对 的集合。

    资料:

    官方文档: https://docs.python.org/3/library/json.html#module-json

    python操作json的其他方式:

    编码(dump)

    1. 将字符串转化为json串(dumps)

    import json
    
    a=""fooar"
    result=json.dumps(a)
    print(result)
    print(type(result))

    执行结果:

    ""fooar"
    <class 'str'>

    2. 将列表转化为json串(dumps)

    import json
    
    a=['foo', {'bar': ('baz', None, 1.0, 2)}]
    result=json.dumps(a)
    print(result)
    print(type(result))

    执行结果:

    ["foo", {"bar": ["baz", null, 1.0, 2]}]
    <class 'str'>

    3. 将字典转化为json串(dumps)

    import json
    
    a={"c": 0, "b": 0, "a": 0}
    result=json.dumps(a)
    print(result)
    print(type(result))

    执行结果:

    {"c": 0, "b": 0, "a": 0}
    <class 'str'>

    4. 转化字典为json串时,进行排序(dumps)

    import json
    
    a={"c": 0, "b": 0, "a": 0}
    result=json.dumps(a, sort_keys=True)
    print(result)

    执行结果:

    {"a": 0, "b": 0, "c": 0}

    对照上一个例子,可以看到json串按照字典的key进行了排序。

    5. 定义json串缩进(dumps)

    import json
    
    a=[1,2,3,{'4': 5, '6': 7}]
    result=json.dumps(a, indent=4)
    print(result)

    执行结果:

    [
        1,
        2,
        3,
        {
            "6": 7,
            "4": 5
        }
    ]

    可以看到json串输出时采用了定义的4个空格进行缩进。

    6. 将产生的json串输出到文件流(dump)

    import json
    
    myfile=open('a.txt','w')
    
    a=[1,2,3,{'4': 5, '6': 7}]
    json.dump(a,myfile, indent=4)
    
    myfile.close()

    执行之后,打开 a.txt 文件进行查看:

    [
        1,
        2,
        3,
        {
            "6": 7,
            "4": 5
        }
    ]

    解码(load)

    1. 将json串解码为列表(loads)

    import json
    
    json_str='["foo", {"bar":["baz", null, 1.0, 2]}]'
    result=json.loads(json_str)
    print(result)
    print(type(result))

    执行结果:

    ['foo', {'bar': ['baz', None, 1.0, 2]}]
    <class 'list'>

    可以看到,这里讲json串解码为一个list。

    2. 将json串解码为字典(loads)

    import json
    
    json_str='{"a": 0, "b": 0, "c": 0}'
    result=json.loads(json_str)
    print(result)
    print(type(result))

    执行结果:

    {'a': 0, 'c': 0, 'b': 0}
    <class 'dict'>

    3. 从文件流解码json串(load)

    以上面dump生成的a.txt为例。

    import json
    
    myfile=open("a.txt",'r')
    
    # json_str='{"a": 0, "b": 0, "c": 0}'
    result=json.load(myfile)
    print(result)
    print(type(result))
    
    myfile.close()

    执行结果:

    [1, 2, 3, {'6': 7, '4': 5}]
    <class 'list'>

    可以看到成功将a.txt的内容解码为list。

    其他

    1. dumps 和 dump 的区别

    下面是两个函数的定义:

    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)
    
    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)

    可以看到,dump比 dumps多了一个参数 fp。

    dumps 会直接将生成的 json串 返回,也就是可以采取 json_str=dumps()的方式来获取结果。

    但是 dump 没有返回值,它会将生成的 json串 输出到 fp 流中。

    2. loads 和 load 的区别

    下面是两个函数的定义:

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

    可以看到 load 的前两个参数是 fp 以及 cls,而 loads 的前两个参数是 s 和 encoding。

    loads 会将 json串直接进行解码输出。

    load 是从 fp 文件流中读取json串,然后进行解码输出。本质load函数定义的时候还是调用的 load函数。

    3. 抓取请求,并解析json内容

    这里采用的是python 的 requests 库进行抓取。

    import json
    import requests
    
    r=requests.get('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600')
    print(type(r.text))
    
    json_str=r.text
    result=json.loads(json_str)
    print(result)
    print(type(result))
    
    if result['id']==26096:
        print("success")
    else:
        print("fail")

    执行结果如下:

    <class 'str'>
    {'imageWidth': 512, 'totalUrl': 'http://baike.baidu.com/view/26096.htm', 'card': [{'name': '中文名', 'format': ['银魂'], 'key': 'm21_bookname', 'value': ['银魂']}], 'key': '银魂', 'id': 26096, 'isSummaryPic': 'y', 'hasOther': 1, ……<class 'dict'>
    success

    这里首先采用request.get 抓取json网页,然后对 r.text 网页内容进行解析。如果网页内容 id 值为 26096的话,这里就打印success。

    备注:当然,这里也可以直接使用 r.json()进行json解析。

  • 相关阅读:
    Apache xmlrpc
    认识serialVersionUID
    解压gz文件
    List of HTTP header fields
    Hadoop的Python语言封装
    httpcore in httpcomponent
    python enumerate 用法
    Hadoop Streaming Made Simple using Joins and Keys with Python « All Things Hadoop
    移位操作
    Chunked transfer encoding
  • 原文地址:https://www.cnblogs.com/miniren/p/7268816.html
Copyright © 2020-2023  润新知