一. 什么是序列化

在我们存储数据或者网络传输数据的时候. 需要对我们的对象进行处理. 把对象处理成方便存储和传输的数据格式. 这个过程叫序列化

不同的序列化, 结果也不同. 但是目的是一样的. 都是为了存储和传输.

  三种序列化的方案:

    1. pickle. 可以将我们python中的任意数据类型转化成bytes并写入到文件中. 同样也可以把文件中写好的bytes转换回我们python的数据. 这个过程被称为反序列化

    2.shelve 简单另类的一种序列化的方案. 有点儿类似后面我们学到的redis. 可以作为一种小型的数据库来使用

    3. json 将python中常见的字典, 列表转化成字符串. 是目前前后端数据交互使用频率最高的一种数据格式.

  二.pickle(重点)

    pickle把python对象写入到文件中的一种解决方法,写入的文件是bytes

  1. import pickle
  2. class Cat:
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6. def catchMouse(self):
  7. print(self.name, "抓⽼老老⿏鼠")
  8. c = Cat("jerry", 18)
  9. bs = pickle.dumps(c) # 序列列化⼀一个对象.
  10. print(bs) # ⼀一堆⼆二进制. 看不不懂
  11. cc = pickle.loads(bs) # 把⼆二进制反序列列化成我们的对象
  12. cc.catchMouse() # 猫依然是猫. 还可以抓⽼老老⿏鼠

    pickle中的dumps可以序列化一个对象,loads可以反序列化一个对象,我们使用dump还可以直接把一个对象写入到文件中

  1. # f = open("cat", mode="wb")
  2. # pickle.dump(c, f) # 写⼊入到⽂文件中
  3. # f.close()
  4. f = open("cat", mode="rb")
  5. cc = pickle.load(f) # 从⽂文件中读取对象
  6. cc.catchMouse()

    pickle还支持多个对象的写出.

  1. lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
  2. f = open("cat", mode="wb")
  3. pickle.dump(lst, f)
  4. f = open("cat", mode="rb")
  5. ll = pickle.load(f)
  6. for el in ll:
  7. el.catchMouse()

三.shelve
    shelve提供python的持久化操作. 什什么叫持久化操作呢? 说⽩白话,就是把数据写到硬盘上.在操作shelve的时候非常的像操作一个字典

  1. import shelve
  2. shelf = shelve.open("sylar")
  3. # shelf["jay"] = "周杰伦"
  4. print(shelf['jay'])
  5. shelf.close()
  6.  
  7. s = shelve.open("sylar")
  8. # s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄⼩小孩"}
  9. print(s['jay'])
  10. s.close()
  1. s = shelve.open("sylar", writeback=True)
  2. s['jay']['name'] = "胡辣汤" # 尝试改变字典中的数据
  3. s.close()
  4. s = shelve.open("sylar")
  5. print(s['jay']) # 改变了了.
  6. s.close()

writeback=True可以动态的把我们修改的信息写入到文件中. 而且这个鬼东西还可以删除数据. 就像字典一样. 上一波操作

  1. s = shelve.open("sylar", writeback=True)
  2. del s['jay']
  3. s.close()
  4. s = shelve.open("sylar")
  5. print(s['jay']) # 报错了了, 没有了了
  6. s.close()
  7. s = shelve.open("sylar", writeback=True)
  8. s['jay'] = "周杰伦"
  9. s['wlj'] = "王⼒力力宏"
  10. s.close()
  11. s = shelve.open("sylar")
  12. for k in s: # 像字典⼀一样遍历
  13.   print(k)
  14. print(s.keys()) # 拿到所有key的集合
  15. for k in s.keys():
  16.   print(k)
  17. for k, v in s.items(): # 像字典⼀一样操作
  18.   print(k, v)
  19. s.close()

四 json(重点)
  json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用json. 为什么这样呢? 因为json的语法格式可以完美的表示出⼀一个对象. 那什么是json: json全称javascript object notation. 翻译过来叫js对象简谱.

  1. wf = {
  2. "name":"汪峰",
  3. "age":18,
  4. "hobby":"上头条",
  5. "wife":{
  6. "name":'⼦子怡',
  7. "age":19,
  8. "hobby":["唱歌", "跳舞", "演戏"]
  9. }
  10. }
  1. 这个不是字典么? 对的. python⾥里里这玩意叫字典. 但是在javascript⾥里里这东⻄西叫json. ⼀模⼀样的. 我们发现用这样的数据结构可以完美的表示出任
    何对象. 并且可以完整的把对象表示出来. 只要代码格式比较好. 那可读性也是很强的. 所以大家公认⽤用这样一种数据结构作为数据交互的格式.

程序产生的字典转化成json格式的json串(字符串). 然后网络传输.

  1. import json
  2. dic = {"a": "⼥女女王", "b": "萝莉", "c": "⼩小清新"}
  3. s = json.dumps(dic) # 把字典转化成json字符串串
  4. print(s) # {"a": "\u5973\u738b", "b": "\u841d\u8389", "c":
  5. "\u5c0f\u6e05\u65b0"}
  1. import json
  2. dic = {"a": "女王", "b": "萝莉", "c": "小清新"}
  3. s = json.dumps(dic, ensure_ascii=False) # 把字典转化成json字符串串
  4. print(s) # {"a": "女王", "b": "萝莉", "c": "小清新"}

json也可以像pickle一样把序列化的结果写入到文件中.

  1. dic = {"a": "⼥女女王", "b": "萝莉", "c": "⼩小清新"}
  2. f = open("test.json", mode="w", encoding="utf-8")
  3. json.dump(dic, f, ensure_ascii=False) # 把对象打散成json写⼊入到⽂文件中
  4. f.close()

同样也可以从文件中读取一个json

  1. f = open("test.json", mode="r", encoding="utf-8")
  2. dic = json.load(f)
  3. f.close()
  4. print(dic)

注意. 我们可以向同一个文件中写入多个json串. 但是读不行

  1. import json
  2. lst = [{"a": 1}, {"b": 2}, {"c": 3}]
  3. f = open("test.json", mode="w", encoding="utf-8")
  4. for el in lst:
  5. json.dump(el, f)
  6. f.close()

注意, 此时文件中的内容是⼀行内容. {"a": 1}{"b": 2}{"c": 3}

这在读取的时候是无法正常读取的. 那如何解决呢?

用dumps和loads. 对每一⾏分别进行处理

  1. import json
  2. lst = [{"a": 1}, {"b": 2}, {"c": 3}]
  3. # 写入
  4. f = open("test.json", mode="w", encoding="utf-8")
  5. for el in lst:
  6. s = json.dumps(el, ensure_ascii=True) + "\n"
  7. f.write(s)
  8. f.close()
  9. # 读取
  10. f = open("test.json", mode="r", encoding="utf-8")
  11. for line in f:
  12. dic = json.loads(line.strip())
  13. print(dic)
  14. f.close()

五.configparser模块
  该模块适用于配置文件的格式与windows ini⽂件类似,可以包含一个或多个节(section)每个节可以有多个参数(键=值)

  首先, 我们先看一个xxx服务器的配置文件

  1. [DEFAULT]
  2. ServerAliveInterval = 45
  3. Compression = yes
  4. CompressionLevel = 9
  5. ForwardX11 = yes

  6. [bitbucket.org]
  7. User = hg

  8. [topsecret.server.com]
    Port = 50022
  9. ForwardX11 = no

我们用configparser就可以对这样的文件进⾏处理.首先, 是初始化

  1. import configparser
  2. config = configparser.ConfigParser()
  3. config['DEFAULT'] = {
  4. "sleep": 1000,
  5. "session-time-out": 30,
  6. "user-alive": 999999
  7. }
  8. config['TEST-DB'] = {
  9. "db_ip": "192.168.17.189",
  10. "port": "3306",
  11. "u_name": "root",
  12. "u_pwd": "123456"
  13. }
  14. config['168-DB'] = {
  15. "db_ip": "152.163.18.168",
  16. "port": "3306",
  17. "u_name": "root",
  18. "u_pwd": "123456"
  19. }
  20. config['173-DB'] = {
  21. "db_ip": "152.163.18.173",
  22. "port": "3306",
  23. "u_name": "root",
  24. "u_pwd": "123456"
  25. }
  26. f = open("db.ini", mode="w")
  27. config.write(f) # 写⼊入⽂文件
  28. f.flush()
  29. f.close()

读取文件信息:

  1. config = configparser.ConfigParser()
  2. config.read("db.ini") # 读取⽂文件
  3. print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
  4. print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信息
  5. # 也可以像字典⼀一样操作
  6. print(config["TEST-DB"]['DB_IP'])
  7. print(config["173-DB"]["db_ip"])
  8. for k in config['168-DB']:
  9. print(k)
  10. for k, v in config["168-DB"].items():
  11. print(k, v)
  12. print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键
  13. print(config.items('168-DB')) #找到'168-DB'下所有键值对
  14. print(config.get('168-DB','db_ip')) # 152.163.18.168 get⽅方法Section下的
  15. key对应的value

增删改操作:

  1. # 先读取. 然后修改. 最后写回⽂文件
  2. config = configparser.ConfigParser()
  3. config.read("db.ini") # 读取⽂文件
  4. # 添加⼀一个章节
  5. # config.add_section("189-DB")
  6. # config["189-DB"] = {
  7. # "db_ip": "167.76.22.189",
  8. # "port": "3306",
  9. # "u_name": "root",
  10. # "u_pwd": "123456"
  11. # }
  12. # 修改信息
  13. config.set("168-DB", "db_ip", "10.10.10.168")
  14. # 删除章节
  15. config.remove_section("173-DB")
  16. # 删除元素信息
  17. config.remove_option("168-DB", "u_name")
  18. # 写回⽂文件
  19. config.write(open("db.ini", mode="w"))

day32 Pyhton 模块02复习 序列化的更多相关文章

  1. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  2. Python模块02/序列化/os模块/sys模块/haslib加密/collections

    Python模块02/序列化/os模块/sys模块/haslib加密/collections 内容大纲 1.序列化 2.os模块 3.sys模块 4.haslib加密 5.collections 1. ...

  3. day23 模块02

    核能来袭--模块 2 1.nametuple() 2.os模块 3.sys模块(重点) 4.序列化 (四个函数) 5.pickle(重点) 6.json(重点中的重点) 1.nametuple() 命 ...

  4. 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...

  5. os模块补充以及序列化模块

    os模块补充以及序列化模块   一.os模块的补充 1.os.path.abspath 能把存在的相对路径的绝对路径显示出来 path = os.path.abspath("连达day19. ...

  6. day32 Pyhton hashlib模块 总结异常处理

    一.当用明文密码进行信息存储的时候,会导致密码的泄露,如何解决问题 通过导入hashlib模块,利用里面存在的算法对字符串进行加密计算得到一串密文的结果 1.这个过程不可逆 2.对于同一个字符串,同一 ...

  7. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  8. python全栈开发-json和pickle模块(数据的序列化)

    一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...

  9. day 020 常用模块02

    主要内容: 什么是序列化 pickle shelve json configparser(模块) 一 序列化 我们在存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和 传 ...

随机推荐

  1. Java Web制作登录 验证码

    具体操作如下: 新建一个servlet,代码如下:标记一个WebServlet, @WebServlet(urlPatterns = {"/checkCode"}) //验证码Se ...

  2. python中使用token模拟登录

    背景:在接口测试中我们经常是需要一个登陆token,或者获取其他用到的参数来关联下一个接口用到的参数. Token的意义及用法 一.Token的来源: 当客户端多次向服务端请求数据时,服务端就需要多次 ...

  3. 修改mysql、oracle、sqlserver默认端口

    一.修改mysql默认端口1202 1.修改mysql安装路径下的my.ini文件中的2个port值 2.修改后重启服务,win+r输入services.msc进入服务,重启服务 二.修改oracle ...

  4. pycharm写的代码提交到git上,提示需要merge失败时解决办法

    当遇到pycharm代码提交需要合并报错时 原因:pycharm目录和git中目录冲突了 解决办法:1.先在git仓库中创建一个文件夹,比如day1 2.然后在pycharm中update一下,可以看 ...

  5. python 3 for与while嵌套

  6. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  7. [剑指Offer]55-题目一:二叉树的深度 题目二:平衡二叉树

    题目一 题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 题解 递归. 代码 class TreeNode { int v ...

  8. golang 条件语句 for range 分析

    for range 作为 golang中的语法糖提供了便利操作; 对于for range 支持 的数据类型包含: 数组以及指向数组的指针 切片 字典 通道 字符串 在range的语法糖中提供了一下特殊 ...

  9. 8.Kafka offset机制

  10. B树【Balanced-Tree】

    一.引言 B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~ 二.二叉树 定义:二叉树即二叉平衡树 意义:通过二分法来进行元素查找,时 ...