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 字符串的格式正确,例如键值对使用双引号括起来,布尔值使用true
和false
等。 -
示例:
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 数据之间的相互转换。在使用过程中,需要注意序列化和反序列化时的常见问题,确保数据的正确性和一致性。