序列化模块

# 序列化模块
    # 序列化 都是转向一个字符串数据类型的过程
    # 序列 ---- 这里说的就是字符串
    # 可以进行序列化的东西
        # 数字、字符串、列表、字典、元组(元组的序列化其实是转换成列表后再去进行序列化的)

    # 从数据类型  到 字符串的过程 就叫做序列化
    # 从字符串  到 数据类型的过程 就叫做反序列化

# 序列化模块
    # json    通用的序列化格式, 能被json序列化的数据类型是数字、字符串、字典
        # 只有很少的一部分数据类型(数字、字符串、字典)能够通过josn换成字符串,
            # dumps 序列化方法
            # loads 反序列化方法

    # pickle (应用的领域,例如游戏中,退出后,当再次登录时还是在上次的位置)
        # 所有python中的数据类型都可以被序列化
        # pickle序列化的内容只有python能理解
        # 且部分反序列化依赖代码
    # shelve   python3中新出现的一种序列化方式
        # 序列化句柄
        # 使用句柄直接操作,非常方便

# json   dumps 序列化方法
dic = {'k1':'v1'}
import json
str_d = json.dumps(dic) # 将字典进行序列化
print(type(str_d), str_d)   # <class 'str'> {"k1": "v1"}

# json   loads 反序列化方法
dic_d = json.loads(str_d)   # 反序列化
print(type(dic_d), dic_d)   # <class 'dict'> {'k1': 'v1'}

# json dump  一次性的序列化后写入文件
dic = {1 : '中国', 2:'b'}
f = open('fff', 'w', encoding='utf-8')
# ensure_ascii=False 使得在文件中的中国是中国
json.dump(dic, f, ensure_ascii=False)   # 将字典序列化成字符串后,写入到了文件中
f.close()

# json load  一次性的读出后反序列化
f = open('fff', encoding='utf-8')
res = json.load(f)  # 从文件中将字符串反序列化
f.close()
print(type(res), res)   # <class 'dict'> {'2': 'b', '1': 'a'}



# pickle    所有python中的数据类型都可以被序列化
    # 方法
    # dumps
    # loads
    # dump
    # load

import time
import pickle

# pickle  dumps  序列化,变成了二进制数据
dic = {1:'v1', 'k2':'v2'}
str_dic = pickle.dumps(dic) # 将字典序列化,变成了二进制数据
print(str_dic)  # b'\x80\x03}q\x00(K\x01X\x02\x00\x00\x00v1q\x01X\x02\x00\x00\x00k2q\x02X\x02\x00\x00\x00v2q\x03u.'

# pickle  loads  反序列化,二进制数据变成数据类型
dic2 = pickle.loads(str_dic)    # 将数据进行反序列化
print(dic2) # {1: 'v1', 'k2': 'v2'}

struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file', 'wb')   # 因为pickle序列化后的是二进制bytes类型,所以要往文件写时,要以b打开,bytes打开

# pickle dump   #
pickle.dump(struct_time1, f)
pickle.dump(struct_time2, f)
f.close()

# pickle load  # load可以分次读出然后反序列化
f = open('pickle_file', 'rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year) # 2001
print(struct_time2.tm_year) # 2033
f.close()




# shelve    # 序列化写入文件时,他还会创建bak、dat、dir文件
    # 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。
    # 所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读的方式打开DB
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float':9.0} # 直接对文件句柄进行操作,序列化操作写入文件,索引为'key'
f.close()

f1 = shelve.open('shelve_file')
existing = f1['key']    # 直接读取文件的'key'位置的序列化的内容,然后反序列化得到
f1.close()
print(existing) # {'int': 10, 'float': 9.0}

 

转载于:https://www.cnblogs.com/whylinux/p/9692952.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值