Python 序列化模块

前言

今天就开始内置模块的分享了,序列化模块作为比较重要的一部分,先对其进行一个概括性的陈述,它就是将一种数据结构转换化为特殊的序列(特殊的字符串、bytes)并且还可以反转回去,主要分为三个部分:

  • json模块:是所有语言公认的一种序列,(最常用的)所以支持的python的数据结构有限:int str bool dict list(tuple) None float
  • pickle模块:只能是python语言中使用的序列化模块,支持python所有的数据;类型以及对象
  • shevle模块:只能是文件存取

json序列

第一部分json模块
两对四个方法

  • dumps、loads主要用于网络传输,可以用于文件存取

  • 使用方法:模拟网络传输(网络传输中以bytes的形式)

    • import json
      dic = {'name': 'LY', 'age': '20', 'hobby': 'bass'}
      print(dic)
      ret = json.dumps(dic)
      print(ret, type(ret))
      #{"name": "LY", "age": "20", "hobby": "bass"} <class 'str'>  首先将字典转化为特殊的字符串,可以细节的看到,特殊字符串中的引号为双引号
      接着会将特殊字符串转化为bytes模式
      ret1 = ret.encode(encoding="utf-8")
      接收方会将接收到的bytes解码
      ret2 = ret1.decode(encoding="utf-8")
      ret3 = json.loads(ret2)
      print(ret3)
      #{'name': 'LY', 'age': '20', 'hobby': 'bass'} 使用loads反转,又会将特殊字符串转换为发送发传输的数据,这便是简单的网络传输的模拟
      
      • 参数
    • 1、ensure_ascii 当它为True的时候,所有非ASCII码字符显示为\uXXXX序列 True、False两种参数

    • import json
      lst = ["刘", "xxy", 3]
      lst1 = json.dumps(lst, ensure_ascii=False)
      lst2 = json.dumps(lst, ensure_ascii=True)
      print(lst1)#["刘", "xxy", 3]
      print(lst2)#["\u5218", "xxy", 3]
      
    • 2、sort_keys 将数据根据keys的值进行排序 True、False两种参数

    • import json
      tu = {'n': 1, 'p': 2, 'a': 3}
      tu1 = json.dumps(tu, sort_keys=True)
      tu2 = json.dumps(tu, sort_keys=False)
      print(tu1)#{"a": 3, "n": 1, "p": 2}
      print(tu2)#{"n": 1, "p": 2, "a": 3}
      
  • dump load:单个数据的存取文件

    • with open("ret1.json", mode="w", encoding="utf-8") as f:
          json.dump(dic, f)
      with open("ret1.json", mode="r", encoding="utf-8") as f1:
          ret4 = json.load(f1)
          print(ret4)
      
  • # 多个数据如何存储在一个文件中
    import json
    dic1 = {'name': 'LY', 'password': '123', 'age': '20'}
    dic2 = {'name': 'XL', 'password': '123', 'age': '20'}
    dic3 = {'name': 'YL', 'password': '123', 'age': '20'}
    with open('ret3.json', encoding='utf-8', mode='a') as f2:    		    f2.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')with open('ret3.json', encoding='utf-8', mode='r') as f3:
            for line in f3:
                ret = json.loads(line)
                print(ret, type(line))
    

pickle序列化

同样两对四个方法

  • dumps、loads 只能是网络传输

  • 模拟网络传输 可直接转化为bytes

    • import pickle
      li = ['LY', '鹿晗', 3, '黑人']
      ret = pickle.dumps(li)
      print(ret)
      #b'\x80\x04\x95\x1e\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x02LY\x94\x8c\x06\xe9\xb9\xbf\xe6\x99\x97\x94K\x03\x8c\x06\xe9\xbb\x91\xe4\xba\xba\x94e.'
      #直接转换为bytes
      ret1 = pickle.loads(ret)
      print(ret1,type(ret1))
      #['LY', '鹿晗', 3, '黑人'] <class 'list'>
      
  • dump、load 数据结构存取文件

    • import pickle
      l1 = ['LY', '鹿晗', 3, '黑人']
      with open('pickle练习.pickle', mode='wb') as f3:
          pickle.dump(l1, f3)
      with open('pickle练习.pickle', mode='rb') as f4:
          ret5 = pickle.load(f4)
          print(ret5, type(ret5)) 
      #['LY', '鹿晗', 3, '黑人'] <class 'list'>
      
  • #多个数据写入文件
    l1 = ['LY', '鹿晗', 3, '黑人']
    l2 = ['YL', '鹿晗', 3, '黑人']
    l3 = ['LYY', '鹿晗', 3, '黑人']
    with open('pickle多个写入.pickle', mode='wb') as f1:
        pickle.dump(l1, f1)
        pickle.dump(l2, f1)
        pickle.dump(l3, f1)
    with open('pickle多个写入.pickle', mode='rb') as f2:
        ret1 = pickle.load(f2)
        ret2 = pickle.load(f2)
        ret3 = pickle.load(f2)
    print(ret1, ret2, ret3)
    

shelve序列化

Python当中数据储存的方案,类似key-value数据库,便于保存Python对象,shelve只有一个open()函数,用来打开指定的文件(字典),会返回一个对象shelf,shelf也是类似字典的对象。

open()函数的格式:shelve.open(file_name, flag=‘’, writeback=True\False)

flag:打开数据存储文件的格式:

  • r 只读模式打开存在数据的文件
  • w 读写模式打开存在数据的文件
  • c 读写模式打开存在数据的文件,如果不存在则创建
  • n 总是创建一个新的、空数据的文件

writeback:一般情况下,我们通过shelve.open()一个对象后,只能进行一次赋值,但是可以通过设定writeback:True来实现,这里writeback的默认值为False。

因为他返回的对象类似字典,操作也与字典类似

例如:

import shelve
db = shelve.open('ly')  #打开文件
print db['ly']  #向从字典中获取键的方式一样读取内容
db.close()  #关闭文件
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acco_30_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值