Python 从文件中读取JSON 数据并解析转存

2024-02-29 1685阅读

温馨提示:这篇文章已超过386天没有更新,请注意相关的内容是否还可用!


文章目录

      • 文章开篇
      • Json简介
      • Json数据类型
      • Json硬性规则
      • Json数据转化网站
      • Json和Dict类型转换
      • json模块的使用
      • Python数据和Json数据的类型映射
      • json.dumps
        • 1.字典数据中含有**存在中文**
        • 2.json数据通过缩进符**美观输出**
        • 3.对Python数据类型中键进行**排序输出**
        • 4.json数据**分隔符的控制**
        • json.dump
        • json.loads
        • json.load
        • Json和非Dict类型数据转换
          • 1.元祖转换
          • 2.列表转换
          • 3.布尔值转换
          • 4.数值转换
          • 案例应用
            • 1.JSON数据的合并与去重
            • 2.JSON数据的动态查询与过滤
            • 总结

              文章开篇

              Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!


              Json简介

              Python 从文件中读取JSON 数据并解析转存

              JSON(JavaScript Object Notation)数据是一种轻量级的数据交换格式;

              JSON数据使用键值对的方式来组织数据,其中键是字符串,值是字符串、数字、布尔值、数组、对象或null;

              由于JSON数据格式简单且易于解析,它已成为现代应用程序中常用的数据格式之一,特别是在Web应用程序和移动应用程序中进行数据交换时,JSON数据被广泛使用。


              Json数据类型

              在JSON(JavaScript Object Notation)语言中,存在六种基本数据类型;

              • 字符串(String):由零个或多个字符组成的有序字符序列,用于表示文本信息;
              • 数字(Number):可以是整数或浮点数,用于表示数值信息;
              • 布尔值(Boolean):只有两个取值,true 或 false,用于表示逻辑状态;
              • 数组(Array):有序的值的集合,每个值可以是一个数据类型或另一个数组,用于表示列表或集合;
              • 对象(Object):无序的键值对集合,其中每个键都是一个字符串,每个值可以是任意数据类型,用于表示复杂的数据结构;
              • null:表示空值或不存在的值;

                这些数据类型可以单独使用,也可以组合起来创建更复杂的数据结构;

                例如,一个对象可以包含多个键值对,其中值可以是字符串、数字、布尔值、数组或另一个对象;

                同样,数组可以包含任意数量的元素,每个元素都可以是任意数据类型;

                这种灵活性和组合性使得JSON成为一种强大且通用的数据交换格式;


                Json硬性规则

                • 在JSON语言中,字符集的使用被严格限定为UTF-8。这是因为UTF-8编码能够支持全球范围内的字符集,确保了JSON数据的跨语言、跨平台兼容性;
                • 为了确保JSON数据的解析一致性和准确性,JSON标准规定字符串的界定符必须是双引号(“”)。这意味着在JSON中,所有的字符串都必须用双引号括起来,而不能使用单引号或其他字符;

                  Json数据转化网站

                  • **json.cn:**https://www.json.cn/
                  • **kjson:**https://www.kjson.com/
                  • **json菜鸟工具:**https://c.runoob.com/front-end/53
                  • **sojson:**https://www.sojson.com/ 非常全的json处理网站
                  • **编程狮-json检验工具:**https://www.w3cschool.cn/tools/index?name=jsoncheck
                  • **JSONViewer:**http://jsonviewer.stack.hu/ 用于检测Json格式是否正确的一个在线应用工具

                    Json和Dict类型转换

                    Python 从文件中读取JSON 数据并解析转存

                    处理JSON文件时,由于文件内容被视为单一字符串,不能直接使用其内部数据;

                    想要访问其键值对,需将其转换为Python字典,这样就可以程序中读取和修改;

                    • Json数据是以字符串表示,Json转Dict叫反序列化;
                    • Dict是内存中的实际数据结构对象,Dict转Json叫序列化;

                      Python的内置json模块是转换JSON与Python字典的便捷工具,提供高效方法处理JSON数据;

                      深入学习该模块可参考官方文档:https://docs.python.org/3/library/json.html。

                      Python 从文件中读取JSON 数据并解析转存

                      json模块的使用

                      json模块是Python的内置模块,无需额外下载安装,使用时直接导入即可

                      import json
                      

                      Python 从文件中读取JSON 数据并解析转存

                      json模块中存在四种方法用来进行Python内置数据类型的转换:

                      方法说明
                      Json.dumps()将python对象编码成json字符串(dict转json)
                      json.loads()将json字符串解码成python对象(json转dict)
                      json.dump()将python中的对象转化成json存储到文件
                      json.load()将文件中的json格式转换成python对象提取出来

                      Python数据和Json数据的类型映射

                      dumps和dump函数的作用是将Python数据类型转成json类型数据;

                      转化对照表如下

                      Python数据类型Json数据类型
                      dictobject
                      list、tuplearray
                      str,unicodestring
                      int、floatnumber
                      Truetrue
                      Falsefalse
                      Nonenull

                      loads和load函数的作用是将json类型数据转换成Python数据类型;

                      转化对照表如下

                      Json数据类型Python数据类型
                      objectdict
                      arraylist
                      stringstr
                      numberint、float
                      trueTrue
                      falseFalse
                      nullNone

                      json.dumps

                      作用:将Python字典类型的数据转成json格式的数据

                      json.dumps(...)参数释义如下

                      import json
                      json.dumps(
                          obj,    # 待转化的对象
                          skipkeys=False,     # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
                          ensure_ascii=True,  # 默认是ASCII码,若设置成False,则可以输出中文
                          check_circular=True,# 若为False,跳过对容器类型的循环引用检查
                          allow_nan=True,     # 若allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)
                          cls=None,
                          indent=None,        # 参数根据格式缩进显示,表示缩进几个空格
                          separators=None,    # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: `
                          encoding="utf-8",   # 编码
                          default=None,       # 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误
                          sort_keys=False,    # 若为False,则字典的键不排序;设置成True,按照字典排序(a到z)
                          **kw)
                      

                      通过示例来解释上面几个常见参数的作用


                      1.字典数据中含有存在中文
                      import json
                      dict_data = {
                          "name": "张三",
                          "age": 18,
                          "sex": "男",
                          "address": "上海",
                          "phone": "10086"
                      }
                      # 字典转成json数据
                      json_data = json.dumps(dict_data)
                      print(type(dict_data), dict_data)   #  {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
                      print(type(json_data), json_data)   #  {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}
                      # 加上ensure_ascii=False参数即可将中文解码
                      json_data = json.dumps(dict_data, ensure_ascii=False)
                      print(type(json_data), json_data)   #  {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"}
                      

                      2.json数据通过缩进符美观输出
                      import json
                      dict_data = {
                          "name": "张三",
                          "age": 18,
                          "sex": "男",
                          "address": "上海",
                          "phone": "10086"
                      }
                      # 字典转成json数据
                      json_data = json.dumps(dict_data)
                      print(type(dict_data), dict_data)   #  {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
                      print(type(json_data), json_data)   #  {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}
                      # 对json数据通过缩进符美观输出,使用indent参数
                      json_data = json.dumps(dict_data, ensure_ascii=False, indent=4)
                      print(type(json_data), json_data)
                      #  {
                      #     "name": "张三",
                      #     "age": 18,
                      #     "sex": "男",
                      #     "address": "上海",
                      #     "phone": "10086"
                      # }
                      

                      3.对Python数据类型中键进行排序输出
                      import json
                      dict_data = {
                          "name": "张三",
                          "age": 18,
                          "sex": "男",
                          "address": "上海",
                          "phone": "10086"
                      }
                      # 字典转成json数据
                      json_data = json.dumps(dict_data)
                      print(type(dict_data), dict_data)   #  {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
                      print(type(json_data), json_data)   #  {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}
                      # 对Python数据类型中键进行排序输出
                      json_data = json.dumps(dict_data, ensure_ascii=False, indent=4, sort_keys=True)
                      print(type(json_data), json_data)
                      #  {
                      #     "address": "上海",
                      #     "age": 18,
                      #     "name": "张三",
                      #     "phone": "10086",
                      #     "sex": "男"
                      # }
                      

                      4.json数据分隔符的控制
                      import json
                      dict_data = {
                          "name": "张三",
                          "age": 18,
                          "sex": "男",
                          "address": "上海",
                          "phone": "10086"
                      }
                      # 字典转成json数据
                      json_data = json.dumps(dict_data)
                      print(type(dict_data), dict_data)   #  {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
                      print(type(json_data), json_data)   #  {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}
                      # 对json数据通过缩进符美观输出,使用indent参数
                      json_data = json.dumps(dict_data, ensure_ascii=False)
                      print(type(json_data), json_data)   #  {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"}
                      json_data = json.dumps(dict_data, ensure_ascii=False, separators=(" + ", " @ "))
                      print(type(json_data), json_data)   #  {"name" @ "张三" + "age" @ 18 + "sex" @ "男" + "address" @ "上海" + "phone" @ "10086"}
                      

                      json.dump

                      • json.dump函数:将Json格式的数据写入文件中;
                      • json.dumps函数:将Python字典类型的数据转成json格式的数据;
                        import json
                        dict_data = {
                            "name": "张三",
                            "age": 18,
                            "sex": "男",
                            "address": "上海",
                            "phone": "10086"
                        }
                        # 使用json.dump;json数据一定是双引号
                        with open(file="test_json.json", mode="w", encoding="utf-8") as file:
                            # 全部写入一行数据,不换行
                            json.dump(dict_data,    # 待写入数据
                                      file,         # File对象
                                      sort_keys=True,       # 键的排序
                                      ensure_ascii=False)   # 显示中文
                        # test_json.json文件内容如下:
                        # {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}
                        with open(file="test_json.json", mode="w", encoding="utf-8") as file:
                            # 全部写入一行数据,不换行
                            json.dump(dict_data,    # 待写入数据
                                      file,         # File对象
                                      indent=4,     # 设置缩进
                                      sort_keys=True,       # 键的排序
                                      ensure_ascii=False)   # 显示中文
                            
                        # test_json.json文件内容如下:
                        # {
                        #     "address": "上海",
                        #     "age": 18,
                        #     "name": "张三",
                        #     "phone": "10086",
                        #     "sex": "男"
                        # }
                        

                        json.loads

                        作用:将json格式的数据转换成python字典类型的数据;

                        import json
                        # json字符串在python中是以字符串形式保存的,只是它的内部是按照json的规则构建
                        json_data = '{"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}'
                        print(type(json_data), json_data)   #  {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}
                        dict_data = json.loads(json_data)
                        print(type(dict_data), dict_data)   #  {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}
                        

                        json.load

                        作用:打开json文件,将之读取后转换成字典形式的数据;

                        • json.load函数:打开json文件,将之转成字典形式的数据;
                        • json.loads函数:将json格式的数据转换成python字典类型的数据;
                          import json
                          with open(file="test_json.json", mode="r", encoding="utf-8") as file:
                              json_to_dict = json.load(file)  # json转成字典
                          print(type(json_to_dict), json_to_dict) #  {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}
                          

                          Json和非Dict类型数据转换


                          1.元祖转换
                          import json
                          # 定义一个元祖类型的数据
                          tuple_data = (1, 2, 3, 4, 5)
                          # 将元祖类型的数据转换成json格式
                          json_data = json.dumps(tuple_data)
                          print(type(json_data), json_data)   #  [1, 2, 3, 4, 5]
                          

                          2.列表转换
                          import json
                          # 定义一个列表类型的数据
                          list_data = [1, 2, 3, 4, 5]
                          # 将列表类型的数据转换成json格式
                          json_data = json.dumps(list_data)
                          print(type(json_data), json_data)   #  [1, 2, 3, 4, 5]
                          

                          3.布尔值转换
                          import json
                          # 定义一个布尔类型的数据
                          bool_data = True
                          # 将布尔类型的数据转换成json格式
                          json_data = json.dumps(bool_data)
                          print(type(json_data), json_data)   #  true
                          

                          4.数值转换
                          import json
                          # 定义一个数值类型的数据
                          bool_data = 10086
                          # 将数值类型的数据转换成json格式
                          json_data = json.dumps(bool_data)
                          print(type(json_data), json_data)   #  10086
                          

                          案例应用


                          1.JSON数据的合并与去重

                          假设有多个JSON文件,每个文件包含一组用户数据,并且希望将这些数据合并到一个文件中,同时去除重复的用户

                          import json
                          # 定义一个函数来合并和去重JSON数据
                          def merge_and_deduplicate_json(file_list, output_file):
                              users = []
                              seen_users = set()
                              for file_path in file_list:
                                  with open(file_path, 'r') as file:
                                      data = json.load(file)
                                      for user in data:
                                          user_id = user.get('id')
                                          if user_id not in seen_users:
                                              users.append(user)
                                              seen_users.add(user_id)
                              # 将合并后的数据写入输出文件
                              with open(output_file, 'w') as file:
                                  json.dump(users, file, indent=4)
                          # 使用示例
                          merge_and_deduplicate_json(['users1.json', 'users2.json', 'users3.json'], 'merged_users.json')
                          

                          2.JSON数据的动态查询与过滤

                          如果有一个大型的JSON数据集,并且需要根据特定的条件来查询和过滤数据,可以使用Python的json模块结合其他数据处理功能

                          import json
                          # 读取JSON文件
                          with open('large_dataset.json', 'r') as file:
                              data = json.load(file)
                          # 定义一个函数来查询和过滤数据
                          def query_and_filter_data(data, query_conditions):
                              filtered_data = []
                              for item in data:
                                  if all(condition(item) for condition in query_conditions):
                                      filtered_data.append(item)
                              return filtered_data
                          # 定义查询条件
                          def is_age_over_25(item):
                              return item['age'] > 25
                          def has_email(item):
                              return 'email' in item and item['email']
                          # 查询和过滤数据
                          filtered_users = query_and_filter_data(data, [is_age_over_25, has_email])
                          # 输出结果
                          for user in filtered_users:
                              print(user)
                          

                          总结

                          Python的json模块是一个非常方便的库,用于处理json格式的数据;

                          json数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据;

                          本文首先对json数据及格式进行了简介,重新认识json数据;

                          其次,结合各种实际案例,将json和Python的各种数据类型,尤其是字典类型进行了转化;

                          最后,重要讲解了json数据的读取、写入和规范化的操作。

                          • json序列化方法:

                            dumps:无文件操作

                            dump:序列化 + 写入文件

                          • json反序列化方法:

                            loads:无文件操作

                            load:读文件 + 反序列化

                          • 格式化写入文件使用indent参数 = 4
                          • 将中文解码使用ensure_ascii参数 = False
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]