当前位置: 首页 > wzjs >正文

网页策划书 网站建设定位外贸企业建网站

网页策划书 网站建设定位,外贸企业建网站,广饶网站设计,网站推广做招商加盟Python pickle 模块学习笔记 1. 简介 pickle 是 Python 的标准序列化模块,用于将 Python 对象转换为字节流(序列化)以及将字节流恢复为对象(反序列化)。它支持几乎所有的 Python 数据类型和对象。 官方文档&#xff…

Python pickle 模块学习笔记

在这里插入图片描述

1. 简介

pickle 是 Python 的标准序列化模块,用于将 Python 对象转换为字节流(序列化)以及将字节流恢复为对象(反序列化)。它支持几乎所有的 Python 数据类型和对象。

官方文档:https://docs.python.org/zh-cn/3/library/pickle.html
序列化模块:marshal详解

2. 核心方法

pickle 模块提供了四个主要方法:

  1. pickle.dump(obj, file)

    • 将对象序列化并写入文件
    • 需要以二进制写入模式打开文件(‘wb’)
    # 示例:序列化基本数据类型到文件
    basic_data = {'int': 42,'float': 3.14,'str': 'Hello Pickle','list': [1, 2, 3],'dict': {'a': 1, 'b': 2},'tuple': (4, 5, 6),'bool': True,'none': None
    }
    with open('basic_data.pkl', 'wb') as f:pickle.dump(basic_data, f)
    
  2. pickle.load(file)

    • 从文件中读取并反序列化为对象
    • 需要以二进制读取模式打开文件(‘rb’)
    # 示例:从文件中读取序列化的数据
    with open('basic_data.pkl', 'rb') as f:loaded_data = pickle.load(f)
    print("读取的数据:", loaded_data)
    
  3. pickle.dumps(obj)

    • 将对象序列化为字节串
    • 返回 bytes 类型数据
    # 示例:将数据序列化为字节串
    bytes_data = pickle.dumps(basic_data)
    print("序列化后的字节串类型:", type(bytes_data))
    print("字节串长度:", len(bytes_data))
    
  4. pickle.loads(bytes)

    • 将字节串反序列化为对象
    • 接收 bytes 类型数据
    # 示例:从字节串恢复数据
    recovered_data = pickle.loads(bytes_data)
    print("恢复的数据:", recovered_data)
    

3. 支持的数据类型

3.1 基本数据类型示例

basic_data = {'int': 42,                    # 整数'float': 3.14,               # 浮点数'str': 'Hello Pickle',       # 字符串'list': [1, 2, 3],          # 列表'dict': {'a': 1, 'b': 2},   # 字典'tuple': (4, 5, 6),         # 元组'bool': True,               # 布尔值'none': None                # None值
}

3.2 高级数据类型示例

import datetime# 自定义类示例
class Person:def __init__(self, name, age, birthday):self.name = nameself.age = ageself.birthday = birthdayself._private_attr = "这是私有属性"def greet(self):return f"Hello, I'm {self.name}!"# 创建实例并序列化
person = Person("张三", 25, datetime.datetime(1998, 5, 15))
with open('person.pkl', 'wb') as f:pickle.dump(person, f)# 反序列化并访问对象方法
with open('person.pkl', 'rb') as f:loaded_person = pickle.load(f)
print(f"姓名: {loaded_person.name}")
print(f"年龄: {loaded_person.age}")
print(f"生日: {loaded_person.birthday}")
print(f"问候语: {loaded_person.greet()}")

4. 协议版本

pickle 支持不同的协议版本,每个版本都有其特点:

# 协议版本示例
data = {"name": "李四", "age": 30}# 测试不同协议版本
for protocol in range(6):  # 0-5 协议版本bytes_data = pickle.dumps(data, protocol=protocol)print(f"协议版本 {protocol} 序列化后的字节长度:", len(bytes_data))

协议版本特点:

  • 协议 0:ASCII 协议,人类可读,兼容旧版本
  • 协议 1:老式二进制协议,比协议 0 更高效
  • 协议 2:支持新式类,添加了对象引用支持
  • 协议 3:支持 bytes 对象,Python 3.x 的默认协议
  • 协议 4:支持大对象,更高效的序列化
  • 协议 5:支持带外数据和更快的序列化

5. 高级特性

5.1 序列化多个对象示例

# 序列化多个不同类型的对象
obj1 = ["apple", "banana", "orange"]
obj2 = {"x": 100, "y": 200}
obj3 = datetime.datetime.now()# 写入多个对象
with open('multiple_objects.pkl', 'wb') as f:pickle.dump(obj1, f)pickle.dump(obj2, f)pickle.dump(obj3, f)# 读取多个对象
with open('multiple_objects.pkl', 'rb') as f:loaded_obj1 = pickle.load(f)loaded_obj2 = pickle.load(f)loaded_obj3 = pickle.load(f)print("列表对象:", loaded_obj1)
print("字典对象:", loaded_obj2)
print("日期对象:", loaded_obj3)

5.2 异常处理示例

# 文件不存在的异常处理
try:with open('not_exists.pkl', 'rb') as f:data = pickle.load(f)
except FileNotFoundError:print("文件不存在错误被捕获")# 损坏数据的异常处理
try:pickle.loads(b'invalid data')
except pickle.UnpicklingError:print("反序列化错误被捕获")

6. 安全注意事项

  1. 安全风险

    • pickle 数据可能包含恶意代码
    • 永远不要 unpickle 不信任来源的数据
    • pickle 数据可能执行任意代码
  2. 最佳实践

    • 只处理可信来源的 pickle 数据
    • 考虑使用 JSON 等更安全的格式
    • 实现数据验证机制

7. 使用场景

适合使用 pickle 的场景:

  • 在 Python 程序间传递复杂数据结构
  • 保存程序状态
  • 缓存计算结果
  • 实现对象持久化
  • 序列化自定义类实例

不适合使用 pickle 的场景:

  • 需要跨语言交互
  • 处理不信任的数据
  • 需要长期存储(因版本兼容性问题)
  • 需要手动编辑序列化数据

8. 与其他序列化方案对比

  1. JSON

    • 优点:跨语言、可读性好、安全
    • 缺点:只支持基本数据类型
    • 使用场景:Web API、配置文件
  2. Marshal

    • 优点:更快、更轻量
    • 缺点:功能受限
    • 使用场景:Python 内部序列化
  3. YAML

    • 优点:可读性最好、配置文件友好
    • 缺点:速度较慢
    • 使用场景:配置文件、数据交换

9. 最佳实践

  1. 文件操作

    # 推荐使用 with 语句处理文件
    with open('data.pkl', 'wb') as f:pickle.dump(data, f)
    
  2. 性能优化

    # 使用最新协议版本获得最佳性能
    pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
    
  3. 错误处理

    try:with open('data.pkl', 'rb') as f:data = pickle.load(f)
    except (pickle.UnpicklingError, AttributeError, EOFError, ImportError) as e:print(f"反序列化错误: {e}")
    except FileNotFoundError:print("文件不存在")
    
  4. 安全建议

    • 实现数据验证机制
    • 限制反序列化时的资源使用
    • 考虑使用 copyreg 注册安全的类型
    • 在处理不信任数据时使用 JSON 替代
http://www.dtcms.com/wzjs/814299.html

相关文章:

  • 网站建设推广优化招聘模板网站做电商资质吗
  • 黄骅港怎么读googleseo優化
  • 网站在国内服务器在国外深圳软件公司平均薪资排行榜
  • 江西省建设工程造价管理局网站扬州市规划建设局网站
  • 娄底市建设网站做视电影网站赚钱吗
  • 做网站优化多少钱济南seo优化公司
  • 南宁网站建设加q479185700数据库与网站
  • 订餐网站开发方案怎么做简单网站首页
  • 如何建立一个论坛网站wordpress博客建站教程
  • 关于做公司官方网站域名申请局域网如何建网站
  • 网站建设优化服务精英网站优化排名工具
  • 济源网站维护dede网站地图不显示文章列表
  • 开封美食网站建设规划衡水网站建设怎么做
  • 做暧暧视频网站网站有什么作用
  • 泰安网站优化公司京东可以免费做特效的网站
  • 怎么做磁力网站怎么申请小程序
  • 温州网站建设大全哪里有网站建设加工
  • 南宁购物网站建设做第三方库网站
  • 学校网站建设方案设计淘宝客网站开发平台
  • 临沂做网站系统网上注册公司流程和费用标准
  • 烟台门户网站开发营销网站设计公司排名
  • 如何制作网站平台无货源网店进货app
  • 网站建设程序员台州网站建设模板
  • 重庆黔江做防溺水的网站长沙短视频代运营公司
  • 中小型教育网站的开发与建设成都新线加网站建设
  • 张家口网站建设费用开发公司工程部职责
  • 查看网站外链代码网站建设进度规划
  • 淮安市建设工程初级职称申报网站公司网站建设概述
  • 昆明设计网站上海网络科技公司官网
  • 色块网站设计网络营销产品营销方案