当我们需要把数据从 Python 中保存到文件中或者把文件中的数据读入到 Python 中时,常用的两种序列化的方式是 json 和 pickle。json 是一种轻量级的数据交换格式,它简单易读,并且容易被人类理解和生成,并且能够在不同的编程语言之间进行数据交换。
Pickle 是一种更高级、更强大的序列化方式,它可以将 Python 中的任意对象序列化成二进制文件,来方便地保存和复原对象。但同时,读取 pickle 文件的时候需要对文件的可信程度进行高度验证,否则可能出现潜在的安全威胁。
接下来针对上述两种序列化方法进行详细讲解:
json 序列化
Python内置的 json 序列化模块可以将 Python 数据结构转换为 json 格式字符串,并可以将 json 格式的字符串转换为 Python 的数据结构。其常用函数如下:
json.dumps(obj, ensure_ascii=True, indent=None)
:将 Python 数据类型转换为 json 格式的字符串。
其中,
- obj:需要序列化的 Python 数据类型。
- ensure_ascii:默认为 True,表示输出的 ASCII 字符,否则输出 Unicode 字符。
- indent:表示输出的缩进空格数。当 indent 等于 0 时,输出全部在一行。
示例如下:
import json
data = {
"name": "Tom",
"age": 20,
"hobby": ["reading", "running"]
}
# 将 Python 数据类型转换为 json 格式字符串
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)
输出结果:
{
"name": "Tom",
"age": 20,
"hobby": [
"reading",
"running"
]
}
json.loads(s, encoding=None)
:将 json 格式的字符串转换为 Python 数据类型。
其中,
- s:需要转换成 Python 数据类型的 json 格式字符串。
- encoding:指定字符串的编码格式。
示例如下:
import json
json_str = '''
{
"name": "Tom",
"age": 20,
"hobby": [
"reading",
"running"
]
}
'''
# 将 json 格式的字符串转换为 Python 数据类型
data = json.loads(json_str)
print(data)
输出结果:
{'name': 'Tom', 'age': 20, 'hobby': ['reading', 'running']}
pickle 序列化
Python 标准库中的 pickle 模块可以序列化任意复杂的 Python 对象并将其保存到文件中,也可以将文件中的数据进行反序列化并重新构建出 Python 中原有的对象。其序列化和反序列化的方法分别为:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
:将 Python 对象序列化并写入到文件中。
其中,
- obj:需要序列化的 Python 对象。
- file:文件类对象,是使用 bin 模式打开的文件对象。
- protocol:序列化协议版本号,详情请看官方文档。
示例如下:
import pickle
data = {
"name": "Alex",
"age": 25,
"hobby": ["reading", "swimming"]
}
# 将 Python 对象通过 pickle.dump() 函数写入文件
with open("data.pkl", "wb") as f:
pickle.dump(data, f)
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")
:从文件中读取 pickle 序列化的 Python 对象。
其中,
- file:文件类对象,是使用 bin 模式打开的文件对象。
示例如下:
import pickle
# 从文件中读取 pickle 序列化的 Python 对象
with open("data.pkl", "rb") as f:
data = pickle.load(f)
print(data)
输出结果:
{'name': 'Alex', 'age': 25, 'hobby': ['reading', 'swimming']}
需要注意的是,pickle 序列化在默认情况下存在安全问题,所以在读取 pickle 序列化文件时应该谨慎处理,避免被恶意的 pickle 序列化文件攻击。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单谈谈Python中的json与pickle - Python技术站