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

下面是关于 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日

相关文章

  • 介绍Python中几个常用的类方法

    介绍Python中几个常用的类方法 在Python中,类方法是可以被类调用的方法。与实例方法相比,类方法在操作类级别的属性或方法时更方便。下面介绍几个常用的类方法。 @classmethod装饰器 @classmethod 是一个装饰器,用于定义类方法。它的第一个参数始终是 cls,代表当前的类(而非实例)。 例如: class MyClass: name …

    python 2023年6月5日
    00
  • Python发展简史 Python来历

    Python发展简史 Python是一门由Guido van Rossum于1989年所创建的高级编程语言,当时Guido在荷兰的CWI(荷兰国家数学和计算机科学研究学院)工作,并正在研究ABC语言。ABC是一种用于教学和科研用途的语言,Guido对该语言产生了浓厚的兴趣。 Guido在创造Python时的目标,是创造一种比ABC语言更强大的语言。在设计Py…

    python 2023年5月13日
    00
  • Python实现各种邮件发送

    下面我将为你详细讲解Python实现各种邮件发送的完整实例教程。 准备工作 在开始之前,你需要先安装smtplib和email模块。如果你使用的是Python 2.x版本,你还需要安装email.MIME模块。你可以通过pip进行安装: pip install smtplib pip install email pip install email.MIME …

    python 2023年5月13日
    00
  • Python使用pandas将表格数据进行处理

    下面是关于“Python使用pandas将表格数据进行处理”的完整实例教程,按照以下内容进行设置: 导入库和读取数据 首先需要导入pandas库和所需的其他库。在导入完库之后,可以通过read_csv()方法来读入CSV文件并转化为DataFrame格式,将数据存储到一个变量中方便后续使用。 import pandas as pd import numpy …

    python 2023年5月14日
    00
  • python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件

    Python调用MoxaPCOMMLite通过串口Ymodem协议实现发送文件的攻略如下: 1. 安装MoxaPCOMMLite 首先,我们需要安装MoxaPCOMMLite。MoxaPCOMMLite是一款串口通信软件,可以帮助我们实现串口通信。我们可以从Moxa官网下载并安装MoxaPCOMMLite。 2. 安装pyserial库 接下来,我们需要安装…

    python 2023年5月15日
    00
  • Python中模拟enum枚举类型的5种方法分享

    下面是对“Python中模拟enum枚举类型的5种方法分享”的详细讲解。 一、背景 在 Python 中,没有真正的枚举类型,但是有时候我们需要使用枚举来表示一些状态。例如,在一个电商网站中,我们定义了一个订单类,它可能有几种不同的状态(待发货、已发货、已签收等等),这些状态可以使用枚举来表示。 二、方法分享 1. 使用类实现 通过定义类来实现模拟枚举类型,…

    python 2023年6月3日
    00
  • windows中python实现自动化部署

    为了演示在Windows中使用Python实现自动化部署的完整攻略,我们需要先了解以下内容: Python的虚拟环境: 多个Python项目之间需要库的版本不同,使用虚拟环境可以隔离项目间的依赖,避免相互干扰。 Python的包管理工具: 程序需要依赖第三方库,需要使用包管理工具来下载和安装相应的依赖库。 Python的自动化部署工具:本文将以Fabric库…

    python 2023年5月19日
    00
  • python移位运算的实现

    Python移位运算的实现 移位运算是指将一个二进制数向左或向右移动指定的位数,移动后的位用0填充。Python提供了左移位运算符(<<)和右移位运算符(>>)。 左移位算 左移位运算将一个二进制数向左移动指定的位数,移动后的空位用0填充。左移n位相当于将这个乘以的n次方。 a = 5 b = a << 2 print(b…

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