python dumps和loads区别详解

Python dumps和loads区别详解

简介

在Python中,我们通常需要将数据序列化为JSON格式或其他格式的字符串以便于存储或传输,同时我们还需要将序列化后的字符串反序列化为原始数据类型,这两个过程可以用Python标准库中的json.dumps()json.loads()函数来完成,但是在某些情况下,我们需要使用Python自带的pickle模块提供的dumps()loads()函数进行序列化和反序列化,本文将会详细讲解这两个函数的使用方法和区别。

dumps()函数

Python内置的pickle模块提供了dumps()函数,可以将Python对象序列化为一个二进制字符串。dumps()函数的基本用法如下:

import pickle
data = {'name': 'Tom', 'age': 25, 'gender': 'male'}
serialized_data = pickle.dumps(data)
print(serialized_data)

上述代码会将data字典序列化为一个二进制字符串并打印到控制台上。dumps()函数还可以接受一个protocol参数,用来指定序列化的协议版本,具体如下:

  • protocol=0(默认):以文本形式打印(ASCII码),不能保存二进制数据,不兼容旧版本python
  • protocol=1:以比特串形式打印,能保存二进制数据,不兼容旧版本python;
  • protocol=2:以比特串形式打印,能保存二进制数据,兼容所有python版本,是Python 2.x版本中pickle使用的版本;
  • protocol=3:可以压缩数据,但是只有3.0及其以上才支持该协议。
import pickle
data = {'name': 'Tom', 'age': 25, 'gender': 'male'}
# 使用协议1序列化
serialized_data = pickle.dumps(data, protocol=1)
print(serialized_data)

loads()函数

loads()函数可以将序列化后的二进制字符串解析为一个Python对象,其基本用法如下:

import pickle
serialized_data = b'\x80\x04\x95\x1a\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x19\x8c\x06gender\x94\x8c\x04male\x94s.'
data = pickle.loads(serialized_data)
print(data)

输出结果为:

{'name': 'Tom', 'age': 25, 'gender': 'male'}

区别与联系

json.dumps()json.loads()函数相比,pickle.dumps()pickle.loads()函数的主要区别在于,JSON是一种文本格式,适合于存储或传输文本数据,而pickle是一种二进制格式,适合于存储或传输Python对象。此外,使用pickle中的序列化和反序列化函数序列化的对象必须在Python环境下才能被反序列化,而使用json中的函数序列化的对象则可以在任何支持json格式的环境下反序列化。

另外,json中的序列化和反序列化函数会更快且更安全,因为pickle中的函数可以执行任何有效的Python代码,这也容易导致安全问题。

下面我们举两个示例来说明区别:

示例1:序列化一个NumPy数组

import pickle
import json
import numpy as np

# 序列化一个NumPy数组
arr = np.array([1, 2, 3, 4, 5])
arr_pickle = pickle.dumps(arr)
arr_json = json.dumps(arr.tolist())

# 反序列化
arr_pickle_unserialized = pickle.loads(arr_pickle)
arr_json_unserialized = np.array(json.loads(arr_json))

# 验证
print(arr_pickle_unserialized == arr)
print(arr_json_unserialized == arr)

输出结果为:

True
True

从输出结果可以看出,picklejson序列化和反序列化NumPy数组的结果是一样的。

示例2:序列化和反序列化自定义函数

import pickle

def add(x, y):
    return x + y

add_pickle = pickle.dumps(add)
add_unpickle = pickle.loads(add_pickle)

print(add, add_pickle, add_unpickle)

输出结果为:

<function add at 0x7fcf767931f0> b'\x80\x04\x95\x0e\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x03add\x94\x93\x94.' <function add at 0x7fcf767a93a0>

从以上输出结果可以看出,在使用pickle序列化和反序列化自定义函数时,反序列化的形式为函数的内存地址而非函数本身,这是因为pickle只序列化函数的定义而不会保存其状态。所以如果需要在另外一个Python环境中使用这个函数,必须重新定义这个函数。

总结

picklejson都是Python中常用的序列化工具,二者都有其优缺点,根据实际情况选择使用。在使用pickle时,要注意安全性和可移植性问题。在序列化时指定协议版本时要考虑版本兼容性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python dumps和loads区别详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python speech模块的使用方法

    下面是关于python speech模块的使用方法的完整攻略。 speech模块简介 speech模块是Python语言中的一个第三方语音识别模块,可以用来进行语音识别。该模块是基于Google Speech Recognition API开发的,支持多种语言和音频格式。使用speech模块前,需要安装Python的PyAudio和SpeechRecogni…

    python 2023年5月19日
    00
  • 详解KMP算法以及python如何实现

    详解KMP算法以及Python如何实现 KMP算法是一种字符串匹配算法,它的全称是Knuth-Morris-Pratt算法,是由Donald Knuth、Vaughan Pratt和James H. Morris位计算科学家于1977年联合发明的。KMP算法的主要思想是利用已知信息来避免无效的字符比较从而提高字符串匹配的效率。本文将详细讲解KMP算法的原理实…

    python 2023年5月13日
    00
  • 详细解读python操作json文件的详细

    详细解读python操作json文件的详细攻略 什么是JSON文件? JSON是JavaScript对象表示法的缩写,是一种轻量级的数据格式,易于阅读和编写。JSON文件通常用于将数据结构化地传输和存储。 Python中操作JSON的模块 在Python中,我们可以使用内置的json模块来轻松地读取和编写JSON文件。 首先,我们需要导入json模块: im…

    python 2023年6月3日
    00
  • 基于Python的微信机器人开发 微信登录和获取好友列表实现解析

    下面是基于Python的微信机器人开发攻略: 一、微信登录 1. 安装itchat 首先,我们需要安装itchat,一个基于Python的微信个人号接口,可以帮助我们实现微信登录和进行相关操作。命令行中输入以下命令即可: pip install itchat 2. 登录微信 接下来,我们要编写微信登录的代码。将以下代码保存为wechat_login.py文件…

    python 2023年5月23日
    00
  • 在Python-NumPy中获取切比雪夫数列对数据的最小二乘法拟合

    获取切比雪夫数列对数据的最小二乘法拟合,可以使用Python的NumPy库中polyfit函数来实现。下面是具体的攻略: 1.导入相应的库为使用NumPy库中的polyfit函数,我们需要首先导入NumPy库和matplotlib库。代码如下: import numpy as np import matplotlib.pyplot as plt 2.加载数据…

    python-answer 2023年3月25日
    00
  • 在 Ubuntu 18.04 上为 python 安装 mysqlclient 时出错

    【问题标题】:Error installing mysqlclient for python on Ubuntu 18.04在 Ubuntu 18.04 上为 python 安装 mysqlclient 时出错 【发布时间】:2023-04-05 08:26:01 【问题描述】: 我在 Ubuntu 上安装了 Python 2.7.15rci 和 Pytho…

    Python开发 2023年4月5日
    00
  • 利用python获取某年中每个月的第一天和最后一天

    针对问题“利用python获取某年中每个月的第一天和最后一天”的完整攻略,以下是具体的步骤: 1. 导入模块 我们需要用到 Python 标准库中的 calendar 模块,所以首先需要导入该模块: import calendar 2. 获取某月的第一天和最后一天 calendar 模块提供了 monthrange() 方法,该方法能够获取指定年份和月份的日…

    python 2023年6月2日
    00
  • 如何在Python中使用psycopg2库连接PostgreSQL数据库?

    在Python中,我们可以使用psycopg2库连接PostgreSQL数据库。psycopg2是一个Python PostgreSQL适配器,它允许我们在Python中连接、操作和管理PostgreSQL数据库。以下是如何在Python中使用psycopg2库连接PostgreSQL数据库的完整使用攻略,包括连接数据库、创建表、插入数据、查询数据、更新数据…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部