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 (流/文件)
更多推荐
所有评论(0)