首页 > 编程语言 >Python的pickle模块

Python的pickle模块

时间:2024-10-26 11:16:27浏览次数:7  
标签:模块 Python data file path 序列化 pickle

        pickle 是 Python 标准库中的一个模块,用于对象的序列化(serialization)和反序列化(deserialization)。
        序列化是将对象转换为字节流的过程,而反序列化则是从字节流恢复对象的过程。
        通过 pickle 模块,可以将 Python 对象保存到文件中,或者通过网络传输,以及存储在数据库中。
主要功能
        序列化(dump):将 Python 对象转换为字节流并保存到文件或其它存储介质中。
        反序列化(load):从字节流中读取并重建原始的 Python 对象。
常用函数
        pickle.dump(obj, file, protocol=None):将对象 obj 序列化并写入到文件 file 中。file 需要是以二进制模式打开的文件对象,例如 open('file.pkl', 'wb')。protocol 是序列化协议的版本,可以选择不同的协议以优化性能或兼容性。
        pickle.load(file):从以二进制模式打开的文件 file 中读取并反序列化对象。例如 open('file.pkl', 'rb')。
        pickle.dumps(obj):将对象 obj 序列化为字节对象(bytes),而不是写入文件。
        pickle.loads(bytes_object):从字节对象(bytes)中反序列化并重建对象。
示例
序列化与反序列化到文件:

import pickle

# 假设有一个要保存的 Python 对象
data = {"name": "张三", "age": 30, "city": "上海"}

# 将对象保存到文件
with open("data.pkl", "wb") as file:
    pickle.dump(data, file)

# 从文件中读取对象
with open("data.pkl", "rb") as file:
    loaded_data = pickle.load(file)

print(loaded_data)  # 输出: {'name': '张三', 'age': 30, 'city': '上海'}

 序列化与反序列化到字节对象:

import pickle

# 假设有一个要保存的 Python 对象
data = ["苹果", "香蕉", "梨"]

# 将对象序列化为字节对象
serialized_data = pickle.dumps(data)

# 从字节对象中反序列化
deserialized_data = pickle.loads(serialized_data)

print(deserialized_data)  # 输出: ['苹果', '香蕉', '梨']

将文件夹序列化到字节对象以及反操作:

import os
import pickle


# 序列化文件夹到文件
def serialize_files_in_directory_with_paths(directory, output_file):
    serialized_data = []

    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            try:
                with open(file_path, 'rb') as f:
                    file_content = f.read()
                serialized_content = pickle.dumps((file_path, file_content))
                serialized_data.append(serialized_content)
            except Exception as e:
                print(f"无法序列化文件 {file_path}: {e}")

    with open(output_file, 'wb') as f:
        for data in serialized_data:
            f.write(data)


# 反序列化文件到文件夹
def deserialize_files_from_file_with_paths(byte_stream_file, output_directory):
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)

    with open(byte_stream_file, 'rb') as f:
        serialized_data = f.read()

    offset = 0
    while offset < len(serialized_data):
        try:
            file_path, file_content = pickle.loads(serialized_data[offset:])
            offset += len(pickle.dumps((file_path, file_content)))
            file_dir = os.path.dirname(file_path)
            if not os.path.exists(file_dir):
                os.makedirs(file_dir)
            with open(file_path, 'wb') as output_file:
                output_file.write(file_content)
        except Exception as e:
            print(f"无法反序列化字节流: {e}")
            break

# 序列化使用示例
directory_path = 'D:\\需要序列化的目录\\需要序列化的目录多层结构'   # 需要序列化的目录,比如位于D:\
output_file_path = 'path/to/output/file.pkl'
serialize_files_in_directory_with_paths(directory_path, output_file_path)



# 反序列化使用示例
byte_stream_file_path = 'file.pkl'
output_directory_path = 'D:\\'   # 反序列化后的文件保存的目录,必须是D:\的根目录,否则会反序列化失败
deserialize_files_from_file_with_paths(byte_stream_file_path, output_directory_path)

注意事项
        安全性:由于 pickle 可以执行反序列化过程中的任意代码,因此从不可信来源加载 pickle 数据可能会带来安全风险。攻击者可以通过恶意构造的 pickle 数据执行任意代码。因此,除非数据来源可信,否则不要轻易使用 pickle.load 或 pickle.loads。
        版本兼容性:不同版本的 Python 可能对 pickle 的协议有不同的支持。高版本的 Python 通常支持低版本的协议,但反之不一定成立。因此,在跨 Python 版本使用 pickle 数据时,需要注意协议的兼容性。
        不可移植性:pickle 数据是特定于 Python 的,因此不能在非 Python 环境中直接使用。如果需要跨语言的序列化方式,可以考虑使用 JSON、XML 或 MessagePack 等。
        性能:在某些情况下,pickle 的性能可能不是最佳选择,尤其是对于非常大的对象。可以考虑使用其他序列化库,如 json(适用于简单数据结构)或 msgpack(更高效的二进制格式)。
常见用途
        持久化存储:将 Python 对象保存到磁盘,以便稍后继续使用。
        缓存:将计算结果缓存到文件中,避免重复计算。
        数据传输:在 Python 程序之间或通过网络传输对象。一个典型应用是CIFAR10数据集,CIFAR10数据集的训练集有50000个图像文件,如果在操作系统中使用直接读写的方式移动这50000个文件,就意味着要执行50000次文件的读和写,效率很低。下图就是一次复制粘贴实测:

虽然所有文件只有大约120M大小,用了12分钟才完成。 

使用上面的代码将所有文件转换成一个字节流文件:

得到的字节流文件:

 对这个120M的单个文件的读写瞬间就可以完成。

标签:模块,Python,data,file,path,序列化,pickle
From: https://blog.csdn.net/xulibo5828/article/details/143230208

相关文章

  • 太极安全监控系统1.0(Python)
    一、项目介绍和功能介绍1.项目介绍安全监控系统是一个综合性的安全监控和防护工具,旨在帮助系统管理员检测和应对网络中的可疑活动。该系统集成了多种安全技术和工具,包括日志分析、网络流量监控、机器学习模型、动态防火墙规则配置、蜜罐部署、沙箱管理和自动反击功能。通......
  • python内置函数大全
    文章目录一、数学运算相关二、类型转换相关三、序列操作相关四、对象操作相关五、反射操作相关六、输入输出相关七、文件操作相关八、代码编译执行相关九、装饰器相关十、其他Python的内置函数是Python提供的一系列可以直接使用的函数,这些函数涵盖了数学运算、类型......
  • Python OpenCV图像复原
    文章目录一、理论背景二、去噪方法三、具体实现步骤四、模糊处理(可选)五、注意事项PythonOpenCV图像复原是一个涉及去除噪声、模糊等失真的过程,旨在恢复图像的原始质量。以下是一个详细的案例教程,包括理论背景和具体实现步骤。一、理论背景图像噪声:图像噪声是图......
  • Python的标准库heapq模块的介绍和简单应用
    文章目录1.堆的基本概念2.`heapq`模块的基本使用2.1创建堆2.2插入元素2.3弹出元素3.其他重要函数3.1`heappushpop`3.2`heapreplace`3.3`nlargest`和`nsmallest`3.4`merge`4.堆的应用场景4.1优先队列4.2堆排序5.结论heapq是Python标准库中一个非......
  • Python玫瑰花
    1.安装(cmd命令)pipinstallturtle2.源码importturtle#设置初始位置turtle.penup()turtle.left(90)turtle.fd(200)turtle.pendown()turtle.right(90)#花蕊turtle.fillcolor("red")turtle.begin_fill()turtle.circle(10,180)turtle.circle(25,110)turt......
  • 【Python中的匿名函数】如何高效使用lambda表达式!
    Python中的匿名函数:如何高效使用lambda表达式Python中的匿名函数,也被称为lambda表达式,是一种简洁的函数定义方式。它们在某些场景中能够显著简化代码结构,提升可读性和代码执行效率。本文将详细讨论lambda表达式的使用方法、优缺点、适用场景以及使用技巧,帮助你更高效地应用......
  • 【探讨Python中的浅拷贝与深拷贝】如何避免共享引用带来的问题!
    探讨Python中的浅拷贝与深拷贝:如何避免共享引用带来的问题在Python编程中,拷贝(Copy)是一个常见的操作,尤其在数据处理、对象传递等情况下,经常会涉及数据的复制操作。浅拷贝和深拷贝的概念对于了解如何复制对象而不影响原始对象至关重要。本文将深入讨论这两种拷贝的原理、区别......
  • 计算机毕业设计Python+大模型微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!《Python+大模型微博情感分析》开题报告一、研究背景与意义随着互联网技术的飞速发展,社交媒体平台......
  • 计算机毕业设计Python+大模型租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!用到的技术:  1.python  2.django后端框架  3.django-simpleui,Django后台  4.......
  • Python实现微博舆情分析的设计与实现
    引言随着互联网的发展,社交媒体平台如微博已经成为公众表达意见、分享信息的重要渠道。微博舆情分析旨在通过大数据技术和自然语言处理技术,对微博上的海量信息进行情感分析、热点挖掘和趋势预测,为政府、企业和研究机构提供决策支持。本文将详细介绍如何使用Python实现微博舆情分析......