Python 序列化 pickle/cPickle模块使用介绍

yizhihongxing

下面是关于 Python 序列化 pickle/cPickle 模块的使用介绍的详细攻略。

什么是pickle/cPickle模块?

Python提供了pickle/cPickle模块,可以将Python对象序列化成字节流用于传输和存储,并可以将序列化后的字节流反序列化成Python对象。pickle模块是Python内置的,而cPickle模块则是C语言写的快速版本。

pickle/cPickle模块常用方法

pickle.dump(obj, fileobj)

将obj序列化并写入 fileobj 文件对象。fileobj 必须是具有 write() 方法的二进制文件对象,例如打开的文件或 BytesIO。

import pickle

# 将对象序列化并写入文件
data = {'name': 'Tom', 'age': 20}
with open('example.pkl', 'wb') as f:
    pickle.dump(data, f)

pickle.dumps(obj, protocol=None, *, fix_imports=True)

将 obj 序列化为字节流。protocol 是序列化协议的版本号,默认使用最高版本。fix_imports 为 Python 2 的兼容性设置,True 表示修正 Python 2 的导入错误。

import pickle

# 将对象序列化为字节流
data = {'name': 'Tom', 'age': 20}
pkl_data = pickle.dumps(data)
print(pkl_data)

pickle.load(fileobj)

从 fileobj 文件对象中读取序列化的对象,并将其反序列化为 Python 对象。fileobj 必须是具有 read() 方法的二进制文件对象,例如打开的文件或 BytesIO。

import pickle

# 从文件中读取序列化的对象
with open('example.pkl', 'rb') as f:
    data = pickle.load(f)
print(data)

pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")

从字节流 bytes_object 中反序列化对象,并将其转换为 Python 对象。fix_imports、encoding 和 errors 为 Python 2 的兼容性设置。

import pickle

# 从字节流中反序列化对象
pkl_data = b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x14\x86\x94u.'
data = pickle.loads(pkl_data)
print(data)

pickle/cPickle模块使用示例

下面我们通过对一个复杂数据对象进行序列化和反序列化的示例来详细介绍pickle/cPickle模块的使用方法。

示例1:使用pickle进行序列化和反序列化

1. 数据定义和对象初始化

import pickle

class Student(object):
    def __init__(self, name="", age=0, gender="male"):
        self.name = name
        self.age = age
        self.gender = gender
    def set_name(self, name):
        self.name = name
    def set_age(self, age):
        self.age = age
    def set_gender(self, gender):
        self.gender = gender
    def display(self):
        print("Name: ", self.name)
        print("Age: ", self.age)
        print("Gender: ", self.gender)

students = []
students.append(Student("Tom", 20, "male"))
students.append(Student("Lucy", 19, "female"))

2. 序列化并写入文件

with open("students.pkl", "wb") as f:
    pickle.dump(students, f)

3. 从文件中读取序列化的对象并反序列化

with open("students.pkl", "rb") as f:
    students = pickle.load(f)
for stu in students:
    stu.display()

输出结果:

Name:  Tom
Age:  20
Gender:  male
Name:  Lucy
Age:  19
Gender:  female

示例2:使用cPickle进行序列化和反序列化

cPickle模块的使用与pickle几乎相同,只是将引用pickle模块改为cPickle模块即可。由于cPickle是C语言写的快速版本,因此在序列化和反序列化大量数据时速度要比pickle快得多。

1. 数据定义和对象初始化

import cPickle as pickle

class Book(object):
    def __init__(self, title="", author="", publish_date=None):
        self.title = title
        self.author = author
        self.publish_date = publish_date
    def set_title(self, title):
        self.title = title
    def set_author(self, author):
        self.author = author
    def set_publish_date(self, publish_date):
        self.publish_date = publish_date
    def display(self):
        print("Title: ", self.title)
        print("Author: ", self.author)
        print("Publish date: ", self.publish_date)

books = []
books.append(Book("Python学习指南", "George", "2020-01-01"))
books.append(Book("Java编程思想", "Bruce", "2019-12-01"))
books.append(Book("C++ Primer Plus", "Stanley", "2020-02-01"))

2. 序列化并写入文件

with open("books.pkl", "wb") as f:
    pickle.dump(books, f)

3. 从文件中读取序列化的对象并反序列化

with open("books.pkl", "rb") as f:
    books = pickle.load(f)
for book in books:
    book.display()

输出结果:

Title:  Python学习指南
Author:  George
Publish date:  2020-01-01
Title:  Java编程思想
Author:  Bruce
Publish date:  2019-12-01
Title:  C++ Primer Plus
Author:  Stanley
Publish date:  2020-02-01

以上就是关于pickle/cPickle模块的使用介绍和示例,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 序列化 pickle/cPickle模块使用介绍 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • pandas中的Timestamp只保留日期不显示时间

    首先,我们需要明确 Timestamp 是 Pandas 中一个用于处理时间序列的数据类型,它表示的是某个具体的时间点。默认情况下,Timestamp 会同时保留日期和时间信息。如果你想保留日期信息,移除时间信息,可以通过下列方法实现: import pandas as pd # 创建一个包含日期和时间的 Timestamp 对象 ts = pd.Times…

    python 2023年6月2日
    00
  • 详解Python 队列(先进先出)

    Python 队列(先进先出) 使用方法完整攻略 在 Python 中,队列是常见的数据结构之一,常用于数据的缓存、异步任务处理等场景中。Python原生支持队列的使用,本文将介绍Python队列的操作以及常见的使用方法。 初始化队列 首先,需要引入Python Queue模块。Python Queue分为两种: Queue 和 PriorityQueue。…

    python-answer 2023年3月25日
    00
  • 如何解决pycharm中用matplotlib画图不显示中文的问题

    如何解决PyCharm中用Matplotlib画图不显示中文的问题 问题描述 在使用PyCharm进行数据分析时,使用Matplotlib画图时,常常会出现中文无法显示的问题。这时候就需要解决这个问题,否则我们所展示的图表将无法清晰地表达意思。 解决方案 设置中文字体 Matplotlib默认的字体库中没有中文字体,需要手动添加。我们可以通过设置Roboto…

    python 2023年5月20日
    00
  • python处理excel文件之xlsxwriter 模块

    Python 处理 Excel 文件之 XlsxWriter 模块 简介 XlsxWriter 是一个使用纯 Python 编写的强大的 Excel 写入库。通过它,我们可以创建和修改 Excel 文档,支持多种自定义样式,如单元格格式、字体、颜色、边框等等。XlsxWriter 还支持创建图表、图表系列、数据有效性等。 安装 通过 pip 可以很容易地安装…

    python 2023年6月3日
    00
  • python 获取图片分辨率的方法

    Python 是一个非常适合处理图片的编程语言。获取图片的分辨率是我们处理图片时经常需要用到的一个操作。下面是 Python 中获取图片分辨率的完整攻略。 安装必要的库 要使用 Python 获取图片分辨率,我们需要使用到图片处理库 PIL 或 Pillow。Pillow 是 PIL 的加强版,因此我们使用 Pillow 比使用 PIL 更好。 使用以下命令…

    python 2023年5月19日
    00
  • Python实现连接两个无规则列表后删除重复元素并升序排序的方法

    下面是实现连接两个无规则列表后删除重复元素并升序排序的方法的完整攻略: 问题描述 假设现在有两个列表 list1 和 list2,它们的元素都是无规律的、可能有重复的、可能不同类型的。现在需要将这两个列表合并成一个列表,删除其中的重复元素,然后对列表中的元素进行升序排序。 解决方案 1. 合并两个列表 使用 extend() 方法将两个列表合并成一个新的列表…

    python 2023年6月5日
    00
  • python互斥锁、加锁、同步机制、异步通信知识总结

    下面是关于“python互斥锁、加锁、同步机制、异步通信知识总结”的完整攻略,包括以下内容: 互斥锁 在多线程环境下,由于多个线程可能同时访问同一个资源,容易引起并发问题。而互斥锁就是一种同步机制,可以确保同时只有一个线程访问该资源。 Python提供了threading模块,可以使用Lock对象作为互斥锁。下面是一个简单示例: import threadi…

    python 2023年5月19日
    00
  • Python中使用遍历在列表中添加字典遇到的坑

    下面是详细讲解“Python中使用遍历在列表中添加字典遇到的坑”的完整攻略。 问题描述 在Python中,我们有时候需要在列表中添加字典。比如要创建一个包含多个字典的列表,每个字典代表一本书,包含书名、作者、价格等信息。我们可以通过遍历的方式逐一添加字典。但是,如果不注意细节,就容易遇到一些问题,比如: 遍历过程中会重复添加相同的字典 添加一个字典后,其它字…

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