• python 处理json数据


    python 处理json数据

    1. json数据格式

    json的数据格式有2种,分别是:
    对象(object):用大括号{}表示;
    数组(array):用中括号[]表示。

    1.1 对象(object)

    在json中对象用“键-值”(key:value)方式配对存储,对象内容以“{”开始,以“}”结束,键与值之间以“:”隔开,每组键值对间以逗号“,”隔开。

    • 键(key)必须是字符串类型;
    • 值(value)可以是数值(number)、字符串(string)、布尔值(bool)、数组(array)或null值。
    • json格式中,字符串需用双引号,json文件内不能使用注释
      如:{“Name”: “Tom”, “Age”: 18}

    1.2 数组(array)

    数组由一些列的值(value)组成,以“[”开始,以“]”结束,各个值之间以逗号“,”隔开。
    数组的值可以是数值(number)、字符串(string)、布尔值(bool)、数组(array)或null值。
    在Python中,json以字符串(string)方式存在。

    2. python数据与json数据互转

    2.1 将python数据转成json格式

    • python与json数据类型对照:
      • dict --> object
      • list,tuple --> array
      • str,unicode --> string
      • int,float,long --> number
      • True --> true
      • False --> false
      • None --> null
    1. 将列表与元组数据转成json数组

      import json  # 导入json模块
      
      # 1.将列表与元组数据转成json数组
      listNumbers = [1, 3, 5, 7, 9]  # 列表数据
      tupleNumbers = [2, 4, 6, 8, 10]  # 元组数据
      jsonData1 = json.dumps(listNumbers)  # 将列表数据转成json数据
      jsonData2 = json.dumps(tupleNumbers)  # 将元组数据转成json数据
      print(f'列表转json数组:{jsonData1}')
      print(f'元组转json数组:{jsonData2}')
      print(type(jsonData1))
      print(type(jsonData2))
      # 列表转json数组:[1, 3, 5, 7, 9]
      # 元组转json数组:[2, 4, 6, 8, 10]
      # 
      # 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    2. 将字典元素组成的列表转成json对象

      import json  # 导入json模块
      
      # 2.将字典元素组成的列表转成json对象
      dict_list = [
          {'Name': 'Tom', 'Age': 19, 'City': 'New York'},
          {'Name': 'Jack', 'Age': 23, 'City': 'London'},
          {'Name': 'Mike', 'Age': 25, 'City': 'Tokyo'}
      ]
      json_data = json.dumps(dict_list)  # 将列表数据转成json数据
      print(json_data)
      print(type(json_data))
      # [{"Name": "Tom", "Age": 19, "City": "New York"}, {"Name": "Jack", "Age": 23, "City": "London"}, {"Name": "Mike", "Age": 25, "City": "Tokyo"}]
      # 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    3. dumps()的sort_keys参数

      python的字典是无序的数据,使用dumps()将python数据转成json对象时,可以添加sort_keys=True,将转成json格式的对象排序。

      import json  # 导入json模块
      
      # 3.dumps()的sort_keys参数
      """
      python的字典是无序的数据,使用dumps()将python数据转成json对象时,可以添加sort_keys=True,将转成json格式的对象排序
      """
      dict_data = {'Name': 'Tom', 'Age': 19, 'City': 'New York'}
      json_data1 = json.dumps(dict_data)  # 将列表数据转成json数据
      json_data2 = json.dumps(dict_data, sort_keys=True)  # 将列表数据转成json数据并排序
      print(json_data1)
      print(json_data2)
      print(json_data1 == json_data2)
      print(type(json_data))
      # {"Name": "Tom", "Age": 19, "City": "New York"}
      # {"Age": 19, "City": "New York", "Name": "Tom"}
      # False
      # 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    4. dumps()的ident参数

      在将Python的字典数据转成json格式的对象时,可以加上indent设置缩排json对象的键-值,让json对象可以更容易显示。

      import json  # 导入json模块
      
      # 4.dumps()的ident参数
      """
      在将Python的字典数据转成json格式的对象时,可以加上indent设置缩排json对象的键-值,让json对象可以更容易显示
      """
      dict_data = {'Name': 'Jack', 'Age': 23, 'City': 'London'}
      json_data = json.dumps(dict_data, sort_keys=True, indent=4)
      print(json_data)
      # {
      #     "Age": 23,
      #     "City": "London",
      #     "Name": "Jack"
      # }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    2.2 将json格式数据转成python数据

    json模块中的loads()方法可以将json格式数据转成python数据。
    json数据类型与python数据类型对照:

    • object --> dict
    • array --> list
    • string --> unicode
    • number(int) --> int,long
    • Number(real) --> float
    • true --> True
    • false --> False
    • num --> None
    import json
    
    # json数据
    json_data = '{"Name": "Jack", "Age": 25, "Gender": "Male"}'
    dict_data = json.loads(json_data)  # 转成python对象
    print(dict_data)
    print(type(dict_data))
    # {'Name': 'Jack', 'Age': 25, 'Gender': 'Male'}
    # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. python处理json文件

    3.1 将python数据转成json文件

    使用json模块中的dump()方法,可以将python数据转成json文件格式

    # author:mlnt
    # createdate:2022/8/18
    """
    使用json模块中的dump()方法,可以将python数据转成json文件格式
    """
    import json
    
    # 字典数据
    dict_data = {'sno': '1001', 'name': 'Jack', 'score': 80}
    filename = 'test1.json'
    with open(file=filename, mode='w') as f:
        # obj:欲存储为json格式的数据,fp:欲存储的文件对象
        json.dump(obj=dict_data, fp=f)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.2 读取json文件

    使用json模块中的load()方法,可以读取json文件,读取json文件的数据将被转换成python的数据格式。

    """
    使用json模块中的load()方法,可以读取json文件,读取json文件的数据将被转换成python的数据格式
    """
    import json
    
    filename = 'test1.json'
    with open(file=filename, mode='r') as f:
        data = json.load(f)
    print(data)
    print(type(data))
    # {'sno': '1001', 'name': 'Jack', 'score': 80}
    # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4. 绘制世界人口地图

    • 安装pygal.maps.world模块

      pip install pygal.maps.world
      
      • 1

    在这里插入图片描述

    4.1 列出json数据中的人口数据

    import json
    
    filename = 'population_data.json'
    with open(file=filename) as f:
        json_data = json.load(f)  # 读取json数据
    
    for data in json_data:
        if data['Year'] == '2010':  # 筛选2010年的数据
            countryName = data['Country Name']  # 国家名称
            countryCode = data['Country Code']  # 国家代码
            population = int(float(data['Value']))  # 人口数
            print(f'代码:{countryCode}-->名称:{countryName}-->人口数:{population}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    COUNTRIES字典中,国家代码用2个英文字母表示。

    from pygal_maps_world.i18n import COUNTRIES
    
    for countryCode in sorted(COUNTRIES.keys()):
        # COUNTRIES字典中,国家代码用2个英文字母表示
        print(f'代码:{countryCode},名称:{COUNTRIES[countryCode]}')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4.2 读取json数据,绘制地图

    import json
    
    import pygal_maps_world.maps
    from pygal_maps_world.i18n import COUNTRIES
    import pygal_maps_world.maps
    from pygal.style import RotateStyle
    from pygal.style import LightColorizedStyle
    
    
    def getCountryCode(countryName):
        """根据国家名称获取国家代码"""
        for code, name in COUNTRIES.items():
            if name == countryName:
                return code
        return None
    
    
    filename = 'population_data.json'
    
    with open(file=filename) as f:
        # 读取json数据
        json_data = json.load(fp=f)
    
    populations = {}  # 创建字典
    for data in json_data:
        if data['Year'] == '2010':
            countryName = data['Country Name']
            population = int(float(data['Value']))
            code = getCountryCode(countryName)
            if code:
                populations[code] = population
    
    # 根据人口数量将国家分3组
    cc_pop_1, cc_pop_2, cc_pop_3, cc_pop_4, cc_pop_5, cc_pop_6 = {}, {}, {}, {}, {}, {}
    for cc, pop in populations.items():
        if pop < 10000000:
            cc_pop_1[cc] = pop
        elif pop < 50000000:
            cc_pop_2[cc] = pop
        elif pop < 100000000:
            cc_pop_3[cc] = pop
        elif pop < 300000000:
            cc_pop_4[cc] = pop
        elif pop < 500000000:
            cc_pop_5[cc] = pop
        else:
            cc_pop_6[cc] = pop
    
    # 加亮颜色主题
    word_map_style = RotateStyle('#336699', base_style=LightColorizedStyle)
    word_map = pygal_maps_world.maps.World(style=word_map_style)
    word_map.title = 'world population in 2010, by country'
    
    # wm.add('2010', populations)
    word_map.add('0-10m', cc_pop_1)
    word_map.add('10m-50m', cc_pop_2)
    word_map.add('50m-100m', cc_pop_3)
    word_map.add('100m-300m', cc_pop_4)
    word_map.add('300m-500m', cc_pop_5)
    word_map.add('>500m', cc_pop_6)
    # word_map.render_to_file('world_population.svg')
    word_map.render_to_file('world_population.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    用浏览器打开生成的html文件。
    在这里插入图片描述


    参考:
  • 相关阅读:
    chrome控制台怎么看hover的样式
    ZBrush 2024(三维数字雕刻软件)
    jetson设置
    【论文阅读】EgoPCA: A New Framework for Egocentric Hand-Object Interaction
    Android Gradle 命令打包AAR
    那个热血澎湃的少年,他居然顶不住了!
    css:img引入svg后修改颜色
    现代信号处理——其他谱估计方法(最大熵谱估计)
    【机器学习】XGB/LGBM
    C++指针与引用(Pointers OR References)
  • 原文地址:https://blog.csdn.net/username666/article/details/126415204