Python中使用JSON进行数据存取的完整指南
Python中使用JSON进行数据存取的完整指南
在Python开发中,JSON(JavaScript Object Notation)作为一种轻量级、易读易写的数据交换格式,被广泛应用于跨平台数据交互、配置文件存储、API数据传输等场景,Python内置了json
模块,提供了简单高效的方法来实现JSON数据的序列化(将Python对象转换为JSON格式)和反序列化(将JSON格式数据转换为Python对象),本文将详细介绍如何使用Python的json
模块进行数据的存储与读取,涵盖基础操作、进阶技巧及常见问题解决。
JSON与Python数据类型的映射关系
在使用JSON存取数据前,需明确JSON格式与Python原生数据类型的对应关系,这是正确处理数据的前提:
JSON格式类型 | Python类型 | 说明 |
---|---|---|
object | dict | 键值对集合,键必须是字符串 |
array | list | 有序序列 |
string | str | 文本字符串 |
number | int/float | 整数或浮点数 |
true/false | True/False | 布尔值 |
null | None | 空值 |
将Python数据存储为JSON文件(序列化)
序列化是指将Python对象转换为JSON字符串并写入文件的过程,核心方法是json.dump()
(直接写入文件)和json.dumps()
(先转换为字符串,再手动写入)。
使用json.dump()
直接写入文件
json.dump()
适用于将Python对象直接序列化并写入文件,避免手动拼接字符串的步骤。
示例:存储字典数据到JSON文件
import json # 准备Python数据(字典) data = { "name": "张三", "age": 25, "is_student": False, "courses": ["Python", "JavaScript", "SQL"], "info": None } # 写入JSON文件(使用utf-8编码,确保中文可读) with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4) print("数据已成功存储到data.json文件")
参数说明:
ensure_ascii=False
:允许非ASCII字符(如中文)直接写入,避免转义为\u
格式。indent=4
:格式化输出,指定缩进为4个空格,提升文件可读性(若省略,JSON会以紧凑格式存储)。
使用json.dumps()
生成JSON字符串后写入文件
若需要先对JSON字符串进行处理(如加密、传输),可使用json.dumps()
生成字符串,再手动写入文件。
示例:生成JSON字符串并写入
import json data = {"name": "李四", "scores": [90, 85, 88]} # 生成JSON字符串 json_str = json.dumps(data, ensure_ascii=False, indent=4) print("生成的JSON字符串:") print(json_str) # 手动写入文件 with open("scores.json", "w", encoding="utf-8") as f: f.write(json_str) print("字符串已写入scores.json文件")
从JSON文件读取数据到Python(反序列化)
反序列化是指将JSON文件中的数据读取并转换为Python对象的过程,核心方法是json.load()
(直接从文件读取)和json.loads()
(从字符串解析)。
使用json.load()
直接从文件读取
json.load()
适用于直接从文件对象解析JSON数据,无需手动读取文件内容。
示例:读取JSON文件并转换为Python字典
import json # 从文件读取数据 with open("data.json", "r", encoding="utf-8") as f: loaded_data = json.load(f) # 输出读取的数据(Python字典类型) print("读取的数据类型:", type(loaded_data)) print("读取的数据内容:") print(loaded_data) # 访问具体数据 print(f"姓名:{loaded_data['name']}") print(f"课程列表:{loaded_data['courses']}")
使用json.loads()
从JSON字符串解析
若JSON数据来自网络请求、用户输入等字符串形式,可使用json.loads()
解析。
示例:解析JSON字符串
import json # JSON字符串(可能来自API响应或用户输入) json_str = '{"name": "王五", "age": 30, "hobbies": ["reading", "traveling"]}' # 解析为Python字典 data = json.loads(json_str) print("解析后的数据类型:", type(data)) print("解析后的数据:", data) # 访问数据 print(f"年龄:{data['age']}") print(f"爱好:{', '.join(data['hobbies'])}")
进阶技巧与常见问题
处理复杂数据类型(如自定义对象)
JSON原生不支持Python的datetime
、自定义类
等复杂类型,需手动转换,处理datetime
对象:
import json from datetime import datetime # 定义包含datetime的数据 data = { "event": "Python讲座", "time": datetime.now(), # datetime对象 "participants": 100 } # 自定义序列化函数 def datetime_handler(obj): if isinstance(obj, datetime): return obj.isoformat() # 转换为ISO格式字符串 raise TypeError(f"Object of type {type(obj)} is not JSON serializable") # 使用default参数处理自定义类型 json_str = json.dumps(data, default=datetime_handler, ensure_ascii=False) print("处理后的JSON:") print(json_str) # 反序列化时,将字符串转回datetime loaded_data = json.loads(json_str) loaded_data["time"] = datetime.fromisoformat(loaded_data["time"]) print("反序列化后的datetime:", loaded_data["time"])
处理文件读写异常
文件操作可能因权限不足、文件不存在等出错,需结合try-except
捕获异常:
import json try: with open("nonexistent.json", "r", encoding="utf-8") as f: data = json.load(f) except FileNotFoundError: print("错误:文件不存在,请检查路径") except json.JSONDecodeError: print("错误:文件内容不是有效的JSON格式") except Exception as e: print(f"发生未知错误:{e}")
大文件的JSON处理(逐行读写)
若JSON文件较大(如日志文件),可逐行读写或使用ijson
库流式解析,避免内存溢出,逐行写入JSON数组:
import json # 准备数据列表 data_list = [{"id": 1, "value": "A"}, {"id": 2, "value": "B"}, {"id": 3, "value": "C"}] # 逐行写入JSON文件(每行一个JSON对象) with open("large_data.json", "w", encoding="utf-8") as f: f.write("[") # 开始数组 for i, item in enumerate(data_list): json.dump(item, f, ensure_ascii=False) if i < len(data_list) - 1: f.write(",\n") # 对象间用逗号分隔 f.write("]") # 结束数组 print("大文件JSON写入完成")
Python的json
模块为JSON数据的存取提供了简洁高效的解决方案,核心操作包括:
- 存储数据:使用
json.dump()
直接写入文件,或json.dumps()
生成字符串后手动写入; - 读取数据:使用
json.load()
从文件读取,或json.loads()
从字符串解析; - 进阶处理:通过
default
参数处理自定义类型,结合异常处理保证代码健壮性,针对大文件采用流式读写。
这些方法,可以轻松应对日常开发中JSON数据的存储与读取需求,实现跨平台、跨语言的数据交互。
还没有评论,来说两句吧...