Python 数据的组织维度及存储

一、数据的组织维度

在 Python 中,数据可以根据其组织方式分为一维数据、二维数据和高维数据。不同的数据维度适用于不同的应用场景,以下是详细介绍:

(一)一维数据

一维数据通常采用线性方式组织数据,一般使用 Python 中的列表、元组或者集合进行存储数据。例如:

# 存储和读取一维数组
def my_write():  # 写入
    # 一维数据,可以使用列表,元组或集合
    lst = ['张三', '李四', '王五', '陈六', '麻瓜']
    with open('student.csv', 'w', encoding='utf-8') as file:
        file.write(','.join(lst))  # 将列表转化为字符串

def my_read():  # 读取
    with open('student.csv', 'r', encoding='utf-8') as file:
        s = file.read()
        lst = s.split(',')  # 将字符串转化为列表
        print(lst)

if __name__ == '__main__':
    # my_write()
    my_read()

(二)二维数据

二维数据也称表格数据,有行和列组成,类似于 Excel 表格,在 Python 中使用二维列表进行存储。例如:

# 存储与读取二维数据
def my_write_table():
    lst = [
        ['商品名称', '单价', '采购数量'],
        ['鼠标', '30', '20'],
        ['键盘', '57', '30'],
        ['耳机', '60', '20']
    ]
    with open('shop.csv', 'w', encoding='utf-8') as file:
        for i in lst:
            line = '\t'.join(i)  # 将列表转化为字符串
            file.write(line)
            file.write('\n')

def my_read_table():
    data = []  # 存储读取数据
    with open('shop.csv', 'r', encoding='utf-8') as file:
        for line in file:  # 按行读取
            s = line.strip().split('\t')  # 去掉行首行尾空白后分割
            data.append(s)  # 将分割后的数据存储到 data 列表中
        print(data)  # 打印最终存储的数据

if __name__ == '__main__':
    # my_write_table()
    my_read_table()
# [['商品名称', '单价', '采购数量'], ['鼠标', '30', '20'], ['键盘', '57', '30'], ['耳机', '60', '20']]

(三)高维数据

高维数据则是使用 Key-Value 方式进行组织数据,在 Python 中使用字典进行存储数据。在 Python 中内置的 json 模块专门用于处理 JSON(JavaScript Object Notation)格式的数据。例如:

import json

# 准备高维数据
lst = [
    {'name': 'kyle', 'age': 20, 'score': 90},
    {'name': 'rock', 'age': 21, 'score': 98},
    {'name': 'sherden', 'age': 19, 'score': 70}
]
# 直接在程序中转
s = json.dumps(lst, ensure_ascii=False, indent=4)
# 参数含义: ensure_ascii:正常显示中文 ;indent增加缩进
print(type(s), s)  # 编码  list -> str ,列表中是字典

# 解码
lst2 = json.loads(s)
print(type(lst2), lst2)

# 编码过程到文件中
with open('student.txt', 'w', encoding='utf-8') as file:
    json.dump(lst, file, ensure_ascii=False, indent=4)

# 解码到程序中
with open('student.txt', 'r', encoding='utf-8') as file:
    lst3 = json.load(file)  # 直接是列表类型
    print(type(lst3), lst3)
# <class 'list'> [{'name': 'kyle', 'age': 20, 'score': 90}, {'name': 'rock', 'age': 21, 'score': 98}, {'name': 'sherden', 'age': 19, 'score': 70}]

二、json 模块简介

json 模块用于处理 JSON(JavaScript Object Notation)数据。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python 的 json 模块提供了将 Python 数据结构(如字典、列表等)与 JSON 数据进行相互转换的功能。

(一)常用方法

函数名称 描述说明
json.dumps(obj) 将Python数据类型转成JSON格式过程,编码过程
json.loads(s) 将JSON格式字符串转成Python数据类型,解码过程
json.dump(obj,file) 与dumps()功能相同,将转换结果存储到文件fie中
json.load(file) 与loads()功能相同,从文件file中读入数据

1. 序列化(将 Python 数据结构转换为 JSON 格式字符串)

  • json.dumps(obj, ensure_ascii=True, indent=None, separators=None, sort_keys=False)

    • obj:需要被序列化的 Python 数据结构。
    • ensure_ascii:默认为 True,表示只输出 ASCII 字符。如果设置为 False,可以输出非 ASCII 字符(如中文)。
    • indent:指定缩进字符数,用于美化输出的 JSON 字符串。如果不指定或为 None,输出的 JSON 字符串没有缩进。
    • separators:指定分隔符,默认为 (',', ': ')。可以自定义分隔符来控制输出格式。
    • sort_keys:如果为 True,则字典的键会按照字母顺序排序。
    • 返回值:返回一个 JSON 格式的字符串。

    示例代码:

    import json
    
    data = {
        "name": "张三",
        "age": 25,
        "is_student": False,
        "scores": [85, 90, 78]
    }
    
    # 序列化为 JSON 字符串
    json_str = json.dumps(data, ensure_ascii=False, indent=4)
    print(json_str)
    

    输出结果:

    {
        "name": "张三",
        "age": 25,
        "is_student": false,
        "scores": [
            85,
            90,
            78
        ]
    }
    
  • json.dump(obj, fp, ensure_ascii=True, indent=None, separators=None, sort_keys=False)

    • 功能与 json.dumps() 类似,但直接将序列化后的 JSON 数据写入文件对象 fp 中。

    示例代码:

    import json
    
    data = {
        "name": "张三",
        "age": 25,
        "is_student": False,
        "scores": [85, 90, 78]
    }
    
    with open("data.json", "w", encoding="utf-8") as file:
        json.dump(data, file, ensure_ascii=False, indent=4)
    

    生成的 data.json 文件内容:

    {
        "name": "张三",
        "age": 25,
        "is_student": false,
        "scores": [
            85,
            90,
            78
        ]
    }
    

2. 反序列化(将 JSON 格式字符串转换为 Python 数据结构)

  • json.loads(json_str)

    • json_str:需要被反序列化的 JSON 格式字符串。
    • 返回值:返回一个 Python 数据结构(如字典、列表等)。

    示例代码:

    import json
    
    json_str = '{"name": "张三", "age": 25, "is_student": false, "scores": [85, 90, 78]}'
    
    data = json.loads(json_str)
    print(data)
    print(type(data))  # 输出:<class 'dict'>
    

    输出结果:

    {'name': '张三', 'age': 25, 'is_student': False, 'scores': [85, 90, 78]}
    <class 'dict'>
    
  • json.load(fp)

    • 功能与 json.loads() 类似,但直接从文件对象 fp 中读取 JSON 数据并反序列化为 Python 数据结构。

    示例代码:

    import json
    
    with open("data.json", "r", encoding="utf-8") as file:
        data = json.load(file)
    print(data)
    

    输出结果:

    {'name': '张三', 'age': 25, 'is_student': False, 'scores': [85, 90, 78]}
    

(二)注意事项

1. 序列化时的常见问题

  • 非 ASCII 字符的处理

    • 默认情况下,json.dumps() 会将非 ASCII 字符(如中文)转义为 Unicode 编码(形如 \uXXXX)。如果希望直接输出非 ASCII 字符,需要将 ensure_ascii 参数设置为 False

    • 示例:

      import json
      
      data = {"name": "张三"}
      json_str = json.dumps(data)  # 默认 ensure_ascii=True
      print(json_str)  # 输出:{"name": "\u5f20\u4e09"}
      
      json_str = json.dumps(data, ensure_ascii=False)
      print(json_str)  # 输出:{"name": "张三"}
      
  • 不能序列化的类型

    • json 模块只能序列化 Python 中的基本数据类型(如字典、列表、字符串、整数、浮点数、布尔值、None 等)。对于不能序列化的类型(如自定义类的实例、文件对象等),需要先将其转换为可序列化的类型,或者通过自定义序列化函数来处理。

    • 示例:

      import json
      
      class Person:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
      person = Person("张三", 25)
      
      # 直接序列化会报错
      # json_str = json.dumps(person)
      # TypeError: Object of type Person is not JSON serializable
      
      # 自定义序列化函数
      def person_to_dict(obj):
          if isinstance(obj, Person):
              return {"name": obj.name, "age": obj.age}
          raise TypeError("Object of type {} is not JSON serializable".format(obj.__class__.__name__))
      
      json_str = json.dumps(person, default=person_to_dict)
      print(json_str)  # 输出:{"name": "张三", "age": 25}
      

2. 反序列化时的常见问题

  • JSON 格式错误

    • 如果提供的 JSON 字符串格式不正确,json.loads()json.load() 会抛出 json.JSONDecodeError 异常。需要确保 JSON 字符串的格式正确,例如键值对使用双引号括起来,布尔值使用 truefalse 等。

    • 示例:

      import json
      
      json_str = '{"name": "张三", "age": 25, "is_student": false, "scores": [85, 90, 78]}'  # 正确的 JSON 格式
      data = json.loads(json_str)
      print(data)
      
      json_str = "{'name': '张三', 'age': 25, 'is_student': false, 'scores': [85, 90, 78]}"  # 错误的 JSON 格式(键使用了单引号)
      try:
          data = json.loads(json_str)
      except json.JSONDecodeError as e:
          print("JSON 格式错误:", e)
      
  • 类型转换问题

    • 反序列化后得到的 Python 数据结构类型可能与原始数据结构类型不完全一致。例如,JSON 中的键总是字符串类型,即使在原始 Python 字典中键是整数或其他类型,反序列化后也会被转换为字符串。

    • 示例:

      import json
      
      data = {1: "one", 2: "two"}
      json_str = json.dumps(data)
      print(json_str)  # 输出:{"1": "one", "2": "two"}
      
      data_loaded = json.loads(json_str)
      print(data_loaded)  # 输出:{'1': 'one', '2': 'two'}
      print(type(data_loaded))  # 输出:<class 'dict'>
      print(type(list(data_loaded.keys())[0]))  # 输出:<class 'str'>
      

(三)应用场景

json 模块在以下场景中非常有用:

  • 数据存储:将数据以 JSON 格式存储到文件中,便于后续读取和处理。
  • 网络通信:在客户端和服务器之间传输数据时,通常将数据序列化为 JSON 格式进行发送和接收。
  • 配置文件:使用 JSON 格式存储应用程序的配置信息,方便读取和解析。

(四)总结

json 模块是 Python 中处理 JSON 数据的核心工具。通过掌握 json.dumps()json.dump()json.loads()json.load() 等方法,可以轻松实现 Python 数据结构与 JSON 数据之间的相互转换。在使用过程中,需要注意序列化和反序列化时的常见问题,确保数据的正确性和一致性。

posted @ 2025-04-20 21:41  kyle_7Qc  阅读(44)  评论(0)    收藏  举报