Python dumps,dump区别,以及详细用法
这是一个非常核心的Python知识点。下面我将从核心区别、详细参数、实战示例以及其他模块(如pickle)的用法四个维度为你进行全面解析。
一、核心区别(先看这个)
简单来说,区别只在于“输出到哪里”:
特性 |
|
|
|---|---|---|
目标 | 文件对象 (File Object) | 字符串 (String) |
动作 | 序列化并直接写入文件 | 序列化并返回字符串 |
返回值 |
| JSON格式的字符串 |
记忆法 | dump to file | dump to string |
二、详细用法与参数解析
两者都属于json模块,用于将 Python 字典/列表等对象转换为 JSON 格式。
1.json.dumps()(Serialize to String)
功能:将 Python 对象转换成 JSON 字符串。
语法:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)关键参数详解:
indent(int): 缩进空格数,用于美化输出(Pretty Print)。ensure_ascii(bool): 默认为True。若为False,则允许输出非ASCII字符(如中文),否则会转义为\uXXXX。sort_keys(bool): 默认为False。若为True,输出的字典按键名排序。separators(tuple): 去除多余空格,压缩JSON。例如(',', ':')。
示例:
import json data = { "name": "张三", "age": 28, "skills": ["Python", "Java"], "is_student": False } # 1. 基础用法 json_str = json.dumps(data) print(json_str) # 输出: {"name": "\u5f20\u4e09", "age": 28, "skills": ["Python", "Java"], "is_student": false} # 2. 显示中文 + 美化输出 pretty_json = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True) print(pretty_json) # 输出: # { # "age": 28, # "is_student": false, # "name": "张三", # "skills": [ # "Python", # "Java" # ] # } # 3. 压缩JSON(用于网络传输) compact_json = json.dumps(data, separators=(',', ':')) print(compact_json) # 输出: {"name":"张三","age":28,"skills":["Python","Java"],"is_student":false}2.json.dump()(Serialize to File)
功能:将 Python 对象序列化并直接写入一个文件对象。
语法:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)参数含义与dumps完全一致,只是第一个参数后多了一个文件指针fp。
示例:
import json data = {"project": "AI Assistant", "version": 1.0} # 结合 with open 语句使用是最佳实践 with open('config.json', 'w', encoding='utf-8') as f: # 直接将 data 写入文件 f json.dump(data, f, ensure_ascii=False, indent=4) # 此时文件 config.json 的内容已经是格式化好的 JSON三、反序列化:load与loads
为了形成完整知识体系,必须提及对应的读取函数:
函数 | 作用 | 输入源 |
|---|---|---|
| 从文件读取 JSON | 文件对象 |
| 从字符串解析 JSON | 字符串 |
# 接上面的 config.json 文件 with open('config.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) # 从文件加载 print(loaded_data['project']) # 输出: AI Assistant json_text = '{"city": "Beijing", "population": 2100}' parsed_data = json.loads(json_text) # 从字符串加载 print(parsed_data['city']) # 输出: Beijing四、扩展到pickle模块(二进制序列化)
pickle是 Python 特有的序列化模块,规则一模一样:带 s 是字符串,不带 s 是文件。
⚠️安全警告:永远不要unpickle来自不信任来源的数据,这可能导致代码执行漏洞。
import pickle data = {'list': [1, 2, 3], 'tuple': (4, 5)} # 1. dumps -> bytes (注意是字节串,不是字符串) byte_data = pickle.dumps(data) print(byte_data) # 输出类似 b'\x80\x04\x95...' # 2. loads -> object restored = pickle.loads(byte_data) print(restored) # {'list': [1, 2, 3], 'tuple': (4, 5)} # 3. dump -> 文件 with open('data.pkl', 'wb') as f: # 注意是 'wb' 二进制写入 pickle.dump(data, f) # 4. load -> 从文件恢复 with open('data.pkl', 'rb') as f: # 注意是 'rb' 二进制读取 restored_from_file = pickle.load(f)五、如何选择?一张表总结
场景 | 推荐函数 | 原因 |
|---|---|---|
保存配置、数据到本地文件 |
| 直接落盘,代码简洁 |
通过网络发送数据 (API/WebSocket) |
| 需要字符串进行传输 |
缓存复杂 Python 对象 (含自定义类) |
| JSON 无法序列化自定义对象 |
读取配置文件 |
| 直接从文件流解析 |
解析接口返回的 JSON 文本 |
| 从接收到的字符串解析 |
终极记忆口诀
s 代表 String (字符串)
没有 s 代表 Stream/File (流/文件)
