当前位置: 首页 > 面试题库 >

Python中什么是pickling和unpickling?

江衡
2023-05-12

在文件中,字符串可以很方便的读写,数字稍微麻烦一些,因为read()方法只返回字符串,读取出来以后我们还需要将其传给int()使其完成数据类型转换。同样;写入文件的时候如果遇到数字也得利用函数str()将其变为字符串写入。但是,如果要操作复杂的数据类型,如列表,字典,或者类的实例,那么这样转换就显得力不从心了。


为了让用户在平常的编程和测试时保存复杂的数据类型,python提供了标准模块,称为pickle。这个模块可以将几乎任何的python对象(甚至是python的代码),转换为字符串表示,这个过程称为pickling。而要从里面重新构造回原来的对象,则称为unpickling。在pickling和unpicking之间,表示这些对象的字符串可以存于一个文件,也可以通过网络远程机器间传输。


所以,一言以蔽之:

Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。


在Python中,pickling和unpickling是用于序列化和反序列化对象的过程。

Pickling是将Python对象转换为字节流的过程,以便可以将其保存到文件、数据库或通过网络传输。通过pickling,可以将复杂的对象转换为一系列字节,然后可以将这些字节重新转换回对象。这对于在不同的Python解释器之间传递对象或将对象永久保存在存储介质上都非常有用。

Unpickling是pickling的反向过程,即从字节流中恢复原始对象的过程。通过unpickling,可以将之前pickled的对象重新还原为原始的Python对象。

下面是一个简单的代码演示:

import pickle

# 定义一个对象
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

# Pickling:将对象转换为字节流
person = Person("Alice", 25)
pickled_person = pickle.dumps(person)

# 打印pickled_person,即字节流表示的对象
print(pickled_person)

# Unpickling:将字节流转换为对象
unpickled_person = pickle.loads(pickled_person)

# 打印unpickled_person,即恢复的对象
print(unpickled_person)

输出:

b'\x80\x04\x95\x1b\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x05Alice\x94\x8c\x03age\x94K\x19ub.'
Person(name=Alice, age=25)

在上面的示例中,我们首先定义了一个Person类,该类具有name和age属性。然后,我们创建一个Person对象,并使用pickle.dumps()函数将其转换为字节流。接下来,我们使用pickle.loads()函数将字节流转换回原始对象。

注意:在实际使用pickling和unpickling时,可能需要将字节流写入文件或从文件中读取字节流。这只是一个简单的示例,用于演示pickling和unpickling的基本概念。

 类似资料:
  • 来自:https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/wordcount.py#l92 Python中和的语法和用法是什么?

  • Python 是荷兰人 Guido van Rossum (吉多·范罗苏姆,中国程序员称其为“龟叔”)在 1990 年初开发的一种解释型编程语言。 我们已经在《编译型语言和解释型语言的区别》一文中讲解什么是解释型语言。 图1:Python 的标志(Logo) Python 的诞生是极具戏曲性的,据 Guido 自述记载,Python 语言是在圣诞节期间为了打发无聊的时间而开发的,之所以会选择 Py

  • 问题内容: 如PythonCookbook中所述,可以在元组之前添加。这是什么意思? 1.18章 将名称映射到序列元素: 123.45) 在同一部分中,提出: 这里的功能是什么? 问题答案: 表示“将此可迭代的元素作为此函数调用的位置参数进行处理”。 从v3.5开始,您还可以在列表/元组/设置文字中执行此操作: 表示“将字典中的键/值对作为此函数调用的其他命名参数进行处理”。 从v3.5开始,您还

  • 问题内容: 我正在使用Pythons模块进行编码。如果将3D空间中的点的坐标描述为,那不是三个维度,三个轴,三个等级吗?或者,如果那是一个维度,那它不应该是点(复数),而不是点吗? 这里是文档: 在Numpy中,尺寸称为轴。轴数为等级。例如,3D空间[1、2、1]中的点的坐标是等级1的数组,因为它具有一个轴。该轴的长度为3。 资料来源:http : //wiki.scipy.org/Tentati

  • 问题内容: 我总是像这样阅读代码来计算时间: 您能在这里解释什么是“%”吗? 我认为,“%”总是用于替换字符串中的某些内容,例如%s表示替换字符串,%d替换数据,但是我不知道这种情况。 问题答案: 是ipython的魔术函数,可用于计时特定代码段(单个执行语句或单个方法)。 从文档: %timeit 要使用它,例如,如果我们想确定using是否比using更快,则只需执行以下操作: 您将获得他们的

  • 本文向大家介绍python中的iterweekdays()是什么?,包括了python中的iterweekdays()是什么?的使用技巧和注意事项,需要的朋友参考一下 iterweekdays()方法。该方法返回将用于一周的工作日数字的迭代器。 示例 输出结果 要么 输出结果

  • 本文向大家介绍python中的itermonthdates()是什么?,包括了python中的itermonthdates()是什么?的使用技巧和注意事项,需要的朋友参考一下 itermonthdates()方法将返回该月的所有天,以及返回一个完整星期所需的月初或月末之后的所有天。 示例 输出结果 重要的是要记住 查看日历显示的输出,从上个月的日期开始,到下个月的日期结束。

  • 本文向大家介绍python中的itermonthdays2()是什么?,包括了python中的itermonthdays2()是什么?的使用技巧和注意事项,需要的朋友参考一下 itermonthdays2()。类似于,返回的天数为元组(即,由天数和工作日数组成)。此方法用于获取一年中月份的迭代器。 示例 输出结果