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 cookbook(数据结构与算法)根据字段将记录分组操作示例

    针对“Python cookbook(数据结构与算法)根据字段将记录分组操作示例”的完整攻略,以下是详细的讲解: 问题描述 假设我们有一组数据记录,每个记录包含一些特定的字段,并且我们想对这些记录根据其中一个或多个字段进行分组。假如我们想将这些数据根据它的date字段进行分组,并对每个分组进行一些计算,该怎么做呢? 解决方案 一般情况下,我们可以使用 ite…

    python 2023年6月3日
    00
  • Redis 如何实现分布式限流?

    以下是 Redis 如何实现分布式限流的完整使用攻略。 Redis 分布式限流简介 在高并发场景下,为了保护系统的稳定性和可用性,需要对请求进行限流。Redis作为一种高性能的存储数据库,可以很好地实现分布式限流。 Redis 分布式限流的实现原理是利用 Redis 的 INCR 命令(INCRBY 命令),该命令可以一个键的值进行子性的自增操作。利用 IN…

    python 2023年5月12日
    00
  • Python爬虫之线程池的使用

    Python爬虫之线程池的使用 线程池简介 在爬虫过程中,网络请求是一个常见且耗时的操作,每个请求都需要等待服务器的响应,这会导致一些性能过低的爬虫速度非常慢。而多线程编程可以有效地提高爬虫的效率。线程池是一种多线程优化技术,它可以在爬取数据时并行执行多个任务,以节约时间和资源,提高爬虫效率。 线程池通过自动管理工作线程来节约线程创建和销毁的时间和资源。池中…

    python 2023年5月19日
    00
  • 正则表达式+Python re模块详解

    正则表达式+Python re模块详解 正则表达式是一种强大的文本处理工具,可以用于各种文本处理任务,如数据清洗、文本分析、信息提取等。在Python中,我们可以使用re模块来操作正则表达式。本攻略将详细讲解Python正则表达式的基本语法、常用函数和应用技巧,帮读者快速掌握正则表达式的用法。 正则表达式的基本语法 正则表达式是由普通字符元字符组成的字符串,…

    python 2023年5月14日
    00
  • Python二元算术运算常用方法解析

    下面是详细讲解“Python二元算术运算常用方法解析”的完整攻略。 1. 什么是二元算术运算? 二元算术运算是指对两个数运算的操作,包括加法、减法、乘法、除法等。 2. Python二元算术运算常用方法 2.1 加法运算 加法运算是指将两个数相加的操作,可以使用加号(+)进行运算。 下面是一个加法运算的示例: a = 5 b = 3 c = a + b pr…

    python 2023年5月14日
    00
  • Python内建类型str源码学习

    下面我会详细讲解Python内建类型str源码学习的完整攻略。 标题一:Python内建类型str源码学习 学习目标 学习Python内建类型str的源码,并了解其实现原理和方法。 学习过程 了解str类型的定义和特点 str代表了字符串数据类型,在Python中是一个内建类型。其特点是不可变,意味着一旦创建字符串,就无法通过赋值改变其内部字符。 查看str…

    python 2023年5月20日
    00
  • 在python中创建表格的两种方法实例

    下面是创建表格的两种方法的完整实例教程。 方法一:使用pandas库创建表格 首先需要确保已经安装pandas库,如果没有安装可以使用以下命令进行安装: pip install pandas 接下来,导入pandas库并创建一个DataFrame对象: import pandas as pd data = {‘姓名’: [‘张三’, ‘李四’, ‘王五’],…

    python 2023年5月13日
    00
  • Python中flatten( )函数及函数用法详解

    Python中flatten( )函数及函数用法详解 什么是flatten()函数 flatten()函数是一个用于将多维数组“压扁”成一维数组的函数,可以将多维数组转换成一维数组。flatten()函数是Python中的numpy库中的一个函数,因此在使用之前需要先导入numpy库。 函数用法 在numpy中,flatten()函数的使用方式有两种,一种是…

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