python-常用模块
发布日期:2021-05-10 08:55:31 浏览次数:20 分类:精选文章

本文共 3099 字,大约阅读时间需要 10 分钟。

序列化与反序列化技术文档

序列化与反序列化的理解

序列化是将内存中的数据类型转换为特定格式的内容,这种格式通常用于存储或传输。这种格式能够被其他平台识别和使用。反序列化则是将这些特定格式的内容转换回内存中的原始数据类型。

例如:

{'aaa': 111} --- 序列化 str({'aaa': 111}) --- "{'aaa': 111}"
{'aaa': 111} <--- 反序列化 eval("{'aaa': 111}") <--- "{'aaa': 111}"

为何要进行序列化

序列化的结果可以用于存储或跨平台传输,提供了以下优势:

  • 指定格式的内容

    • 专用格式(如 pickle 只能在 Python 中使用)
    • 通用格式(如 json 可以被所有语言识别)
  • 两大用途

    • 存档
    • 跨平台数据交互

  • 序列化与反序列化的实现

    使用 Python 的 json 模块

    序列化示例

    import json
    # 序列化内容
    json_res = json.dumps([1, 'aaa', True, False])

    反序列化示例

    l = json.loads(json_res)

    文件操作示例

    序列化文件
    import json
    with open('test.json', 'wt', encoding='utf-8') as f:
    json.dump([1, 'aaa', True, False], f)
    读取文件反序列化
    with open('test.json', 'rt', encoding='utf-8') as f:
    json_res = f.read()
    l = json.loads(json_res)

    示例:简单文件操作

    序列化

    with open('test.json', 'wt', encoding='utf-8') as f:
    json.dump([1, 'aaa', True, False], f)

    反序列化

    with open('test.json', 'rt', encoding='utf-8') as f:
    l = json.load(f)
    print(l, type(l))

    注意事项

    • Python版本差异:在 Python 2.7 和 3.6 及以上版本中,json.loads 可以处理 bytes 类型,但 3.5 不支持。
    • 自定义 JSON 格式
      res = json.dumps({'name': '哈哈哈'})
      print(res, type(res))
      res = json.loads(b'{"name": "\u54c8\u54c8\u54c8"}')
      print(res, type(res))

    猴子补丁(Monkey Patching)

    概念

    猴子补丁是通过动态替换运行时模块的源代码实现的属性替换。其核心在于替换模块的方法或属性。

    示例

    import json
    import ujson
    def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads
    # 在入口文件处运行 monkey_patch_json()

    注意事项

    安装 ujson:

    pip3 install ujson

    Pickle 模块

    示例

    序列化示例

    import pickle
    res = pickle.dumps({1, 2, 3, 4, 5})
    print(res, type(res))

    反序列化示例

    s = pickle.loads(res)
    print(s, type(s))

    Pickle 的兼容性问题

    在 Python 3 中,pickle.dump 默认使用协议版本 4。为了与 Python 2 兼容,可设置 protocol=2


    ConfigParser 模块

    示例

    test.ini 文件内容

    # 注释1
    # 注释2
    [section1]
    k1 = v1
    k2: v2
    user: egon
    age: 18
    is_admin: true
    salary: 31
    [section2]
    k1 = v1

    加载配置文件

    import configparser
    config = configparser.ConfigParser()
    config.read('test.ini')
    print(config.sections()) # 获取所有 section
    print(config.options('section1')) # 获取 section1 下的所有选项
    print(config.items('section1')) # 获取 section1 下的所有键值对
    res = config.getint('section1', 'age')
    print(res, type(res))
    res = config.getboolean('section1', 'is_admin')
    print(res, type(res))
    res = config.getfloat('section1', 'salary')
    print(res, type(res))

    Hashlib 模块

    哈希算法的定义

    哈希算法是一种将输入内容转换为固定长度的 hash 值的算法。其特点包括:

  • 输入相同时,哈希值必然相同。
  • 哈希值不可逆。
  • 固定算法决定固定长度。
  • 示例

    MD5 计算

    import hashlib
    m = hashlib.md5()
    m.update('hello'.encode('utf-8'))
    m.update('world'.encode('utf-8'))
    res = m.hexdigest()
    print(res)

    分步哈希示例

    m1 = hashlib.md5('he'.encode('utf-8'))
    m1.update('llo'.encode('utf-8'))
    m1.update('w'.encode('utf-8'))
    m1.update('orld'.encode('utf-8'))
    res = m1.hexdigest()
    print(res)

    密码加盐

    import hashlib
    m = hashlib.md5()
    m.update('天王'.encode('utf-8'))
    m.update('alex3714'.encode('utf-8'))
    m.update('盖地虎'.encode('utf-8'))
    print(m.hexdigest())

    Subprocess 模块

    示例

    运行外部命令

    import subprocess
    obj = subprocess.Popen('dir d:\\', shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
    res = obj.stdout.read()
    print(res.decode('gbk'))

    以上是对序列化和反序列化技术的全面介绍,涵盖了 jsonpickleconfigparserhashlibsubprocess 等多个模块的应用示例。

    上一篇:[Python]Numpy读取npz文件并且使用matplotlib绘制散点图和折线图
    下一篇:rsync远程同步

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月28日 13时21分01秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    2024最新程序员接活儿搞钱平台盘点 2023-01-24
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2025最新大模型技术学习过程梳理,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新0基础怎么转行网络安全?零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新Bash Shell入门指南,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新关于HW护网行动的一些知识,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新大模型学习路线,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新大模型开发流程(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-25
    2025版最新大模型微调方法(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新大语言模型的指令微调,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新小白学习大模型:什么是大模型?零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新常用黑客工具之【Nmap 教程基础】零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了 2023-01-25
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了 2023-01-25
    2025版网络工程11个高含金量证书(非常详细)零基础入门到精通,收藏这篇就够了 2023-01-25
    2025自学成为黑客必读的5本书籍,带你从小白进阶成大佬 2023-01-25