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中json格式数据的编码与解码方法详解

    Python中json格式数据的编码与解码方法详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。JSON格式数据主要用于前后端数据传输,具有体积小、易于解析、易于传输的特点。 在Python中,可以通过json模块对JSON格式数据进行编码和解码。 JSO…

    python 2023年5月31日
    00
  • Python 进程操作之进程间通过队列共享数据,队列Queue简单示例

    Python 进程操作之进程间通过队列共享数据,队列Queue简单示例 什么是Queue Python中的Queue模块提供了多种多样的队列实现。队列类对象的主要操作包括 put、get、qsize和empty等。为了实现进程之间的同步,Queue模块提供了一个Queue的类。 Queue类是一个同步队列,用于在python多线程编程时在多个线程之间传递任务…

    python 2023年5月19日
    00
  • Python实现全局变量的两个解决方法

    下面我将详细讲解“Python实现全局变量的两个解决方法”的完整攻略。 前言 在 Python 中,可以使用全局变量来管理数据。但是在使用全局变量时需要注意,因为全局变量会受到 Python 解释器的影响和其他因素的影响而修改。所以,需要合理地使用全局变量,避免代码出现不可预知的错误。 解决方法一:使用 global 关键字 使用 global 关键字可以在…

    python 2023年5月19日
    00
  • python获取linux系统信息的三种方法

    下面是详细的攻略: Python获取Linux系统信息的三种方法 在编写Python程序时,有时需要获取Linux系统的信息。本文将介绍三种常见的方法来获取Linux系统信息。 1. 使用commands模块 使用commands模块可以方便地获取Linux系统的信息。这个模块已经被Python将近10年废弃了,替换方案推荐使用subprocess模块。 以…

    python 2023年5月30日
    00
  • 图文详解Python如何导入自己编写的py文件

    以下是详细讲解“图文详解Python如何导入自己编写的py文件”的完整攻略。 问题描述 在Python中,我们经常需要使用到自己编写的一些模块或函数,这些模块或函数通常保存在.py文件中。那么如何在Python中导入这些.py文件呢? 解决方案 在Python中,我们可以使用import语句来导入我们自己编写的.py文件。具体的导入方式有以下几种: 直接导入…

    python 2023年6月3日
    00
  • python批量修改xml文件中的信息

    下面是“python批量修改xml文件中的信息”的完整攻略: 步骤一:安装相关库 在终端中使用以下命令安装需要用到的库: pip install xml.etree.ElementTree pip install lxml 步骤二:读取xml文件中的数据 代码示例: import xml.etree.ElementTree as ET tree = ET.p…

    python 2023年6月3日
    00
  • 如何在Python中进行单元测试?

    在Python中进行单元测试,通常使用unittest模块来实现。 编写测试代码 第一步是编写测试代码。测试代码应该覆盖您要测试的每个功能。在unittest中,测试代码必须是一个派生自unittest.TestCase的类,它包含测试用例。 其中,一个测试用例通常包括三个步骤:准备测试数据、执行测试代码、比较测试结果。在unittest中,可以使用setU…

    python 2023年4月19日
    00
  • 代码分析Python地图坐标转换

    这里是“代码分析Python地图坐标转换”的完整攻略: 介绍 我们在进行地图开发时,常常需要进行坐标的转换。例如,从百度地图坐标系(BD-09)转换为标准的经纬度坐标系(WGS-84)。而这个过程涉及一些数学知识和算法,需要我们进行代码实现。 在这个实践中,我们将学习使用Python实现坐标转换算法,具体来说,我们将实现两个常见的坐标转换算法,分别是BD-0…

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