码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用


    文章目录

    • 序列化和反序列化
      • JSON模块
      • pickle模块
      • 进阶案例

    序列化和反序列化

    通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(例如列表、字典、元组等),就无法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里。

    设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化,反之,从文件的字节序列恢复到内存中,就是反序列化。

    Python中提供了JSON和pickle两个模块用来实现数据的序列化和反序列化。

    JSON模块

    JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,它基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON的本质是字符串!

    使用JSON实现序列化
    JSON提供了dump和dumps方法,将一个对象进行序列化。

    dumps方法的作用是把对象转换成为字符串,它本身不具备将数据写入到文件的功能。

    import json
    file = open('names.txt', 'w')
    names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']
    # file.write(names)  出错,不能直接将列表写入到文件里
    
    # 可以调用 json的dumps方法,传入一个对象参数
    result = json.dumps(names)
    
    # dumps 方法得到的结果是一个字符串
    print(type(result))  # 
    
    # 可以将字符串写入到文件里
    file.write(result)
    
    file.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    dump方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里。

    import json
    
    file = open('names.txt', 'w')
    names = ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'chris']
    
    # dump方法可以接收一个文件参数,在将对象转换成为字符串的同时写入到文件里
    json.dump(names, file)
    file.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:如果是一个空对象,调用dumps方法转换成为一个JSON对象,得到的结果是null(JS里的空对象)

    json.dumps(None)  # null
    
    • 1

    使用JSON实现反序列化
    使用loads和load方法,可以将一个JSON字符串反序列化成为一个Python对象。

    loads方法需要一个字符串参数,用来将一个字符串加载成为Python对象。

    import json
    
    # 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
    result = json.loads('["zhangsan", "lisi", "wangwu", "jerry", "henry", "merry", "chris"]')
    print(type(result))  # 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    load方法可以传入一个文件对象,用来将一个文件对象里的数据加载成为Python对象。

    import json
    
    # 以可读方式打开一个文件
    file = open('names.txt', 'r')
    
    # 调用load方法,将文件里的内容加载成为一个Python对象
    result = json.load(file)
    
    print(result)
    file.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    pickle模块

    和json模块类似,pickle模块也有dump和dumps方法可以对数据进行序列化,同时也有load和loads方法进行反序列化。区别在于,json模块是将对象转换成为字符串,而pickle模块是将对象转换成为二进制。

    pickle模块里方法的使用和json里方法的使用大致相同,需要注意的是,pickle是将对象转换成为二进制,所以,如果想要把内容写入到文件里,这个文件必须要以二进制的形式打开。

    区别(了解)
    思考: json和pickle两个模块都可以将对象进行序列化和反序列化,那它们有哪些区别,在使用场景上又该如何选择?

    • json模块:

    将对象转换成为字符串,不管是在哪种操作系统,哪种编程语言里,字符串都是可识别的。

    json就是用来在不同平台间传递数据的。

    并不是所有的对象都可以直接转换成为一个字符串,下标列出了Python对象与json字符串的对应关系。

    PythonJSON
    dictobject
    list, tuplearray
    strstring
    int, floatnumber
    Truetrue
    Falsefalse
    Nonenull

    如果是一个自定义对象,默认无法装换成为json字符串,需要手动指定JSONEncoder。

    如果是将一个json串重新转换成为对象,这个对象里的方法就无法使用了。

    import json
    
    class MyEncode(json.JSONEncoder):
        def default(self, o):
            # return {"name":o.name,"age":o.age}
            return o.__dict__
    
    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def eat(self):
            print(self.name+'正在吃东西')
    
    p1 = Person('zhangsan', 18)
    
    # 自定义对象想要转换成为json字符串,需要给这个自定义对象指定JSONEncoder
    result = json.dumps(p1, cls=MyEncode)
    print(result)  # {"name": "zhangsan", "age": 18}
    
    # 调用loads方法将对象加载成为一个对象以后,得到的结果是一个字典
    p = json.loads(result)
    print(type(p))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • pickle模块:

    pickle序列化是将对象按照一定的规则转换成为二进制保存,它不能跨平台传递数据。
    pickle的序列化会将对象的所有数据都保存。

    进阶案例

    【Python】Python 实现猜单词游戏——挑战你的智力和运气!

    【python】Python tkinter库实现重量单位转换器的GUI程序

    【python】使用Selenium获取(2023博客之星)的参赛文章

    【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

    使用腾讯云 Cloud studio 实现调度百度AI实现文字识别

    【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

    【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析

    【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中

    【小白必看】Python图片合成示例之使用PIL库实现多张图片按行列合成

    【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

    【小白必看】Python词云生成器详细解析及代码实现

    【小白必看】Python爬取NBA球员数据示例

    【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码

    【小白必看】使用Python批量下载英雄联盟皮肤图片的技术实现

    【小白必看】Python爬虫数据处理与可视化

    【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

    【小白必看】利用Python生成个性化名单Word文档

    【小白必看】Python爬虫实战:获取阴阳师网站图片并自动保存

    小白必看系列之图书管理系统-登录和注册功能示例代码

    小白实战100案例: 完整简单的双色球彩票中奖判断程序,适合小白入门

    使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

    使用selenium爬取猫眼电影榜单数据

    图像增强算法Retinex原理与实现详解

    爬虫入门指南(8): 编写天气数据爬虫程序,实现可视化分析

    爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

    爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

    爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

    爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

    爬虫入门指南(3):Python网络请求及常见反爬虫策略应对方法

    爬虫入门指南(2):如何使用正则表达式进行数据提取和处理

    爬虫入门指南(1):学习爬虫的基础知识和技巧

    深度学习模型在图像识别中的应用:CIFAR-10数据集实践与准确率分析

    Python面向对象编程基础知识和示例代码

    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作

    Python文件操作指南:编码、读取、写入和异常处理

    使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章

    Python多线程与多进程教程:全面解析、代码案例与优化技巧

    Selenium自动化工具集 - 完整指南和使用教程

    Python网络爬虫基础进阶到实战教程

    Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识

    Pandas数据处理与分析教程:从基础到实战

    Python 中常用的数据类型及相关操作详解

    【2023年最新】提高分类模型指标的六大方案详解

    Python编程入门基础及高级技能、Web开发、数据分析和机器学习与人工智能

    用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归

  • 相关阅读:
    Unity Shader: Blend混合
    K近邻算法(KNN)原理整理小结
    AIGC , 超级热点 or 程序员创富新起点?
    C_12练习题
    day09学习总结
    使用nodejs/exceljs读取、操作、写入excel文件
    【Pytorch】(十五)模型部署:ONNX和ONNX Runtime
    C++深入学习part_1
    【小笔记】当一个算法性能不满意,可能是这几方面的原因
    【Java】时间复杂度与空间复杂度
  • 原文地址:https://blog.csdn.net/qq_33681891/article/details/132402175
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号