文件操作基础之pickle模块

六、pickle模块

1.Python的pickle模块

  • pickle是python中独有的序列化模块,所谓独有,就是指不能和其他编程语言的序列化进行交互,因为pickle将数据对象转化为bytes
  • dumps和dump都是进行序列化的,而loads和load则是反序列化的
  • dumps将所传入的变量的值序列化为一个bytes,然后,就可以将这个bytes写入磁盘或者进行传输
  • 而dump则更加一步到位,在dump中可以传入两个参数,一个为需要序列化的变量,另一个为需要写入的文件
  • loads当我们要把bytes反序列化为内存对象
  • load直接妇女序列化一个文件为内存对象

2.pickle VS json

  • 如果没有协同和交互的要求,那么就用pickle,直接序列化二进制数据就够用了,尤其是cPickle会带来高性能
  • 如果有协同交互的要求,那么可以用json,它将生成可读的文本内容,比如网络上传输
  • 对于错误的甚至恶意的字节流,pickle并没有安全的措施。所以,不要unpickle从不受信来源得到的数据

3.pickle模块使用

  • 基础使用
import pickle


obj = {'a': 1, 'b': 2, 'c': 3}
pickle.dump(obj, open("tmp.txt", "wb"))

# 从tmp.txt中读取并恢复obj对象
obj2 = pickle.load(open("tmp.txt", "rb"))
print (obj2)

在这里插入图片描述

模块的作用:数据持久化,一些字符串、列表、字典等数据转换为一种可以传输或存储的格式

  • 将要持久化存储的数据如accounts,保存到account.db文件中
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import pickle


accounts = {
 1000:{
 'name':'xiaoming',
 'email':'10000@qq.com',
 'balance':100,
 'bank_acc':{
 'ICBC':100,
 'ABC':1000
 }
 }
 }
f = open('account.db','wb')
f.write(pickle.dumps(accounts))
f.close()

在这里插入图片描述

查看:

import pickle
f = open('account.db','rb')
account_db = pickle.loads(f.read())
print (account_db)

在这里插入图片描述

在这里插入图片描述

  • 对账户中的余额进行操作
import pickle

# 将存储了accounts这个持久化数据的文件赋值给变量
acc_file_name = 'account.db'

# 以二进制文件制度的方式打开这个文件
account_file = open(acc_file_name,'rb')

# 对序列化后的文件内容进行反序列化
account_dic = pickle.loads(account_file.read())
account_file.close() # 关闭文件

# 对读取出来的序列化内容进行修改(修改对应的余额)
account_dic[1000]['balance'] -= 20

# 以二进制只写的方式打开存储了持久化数据的文件
f = open(acc_file_name,'wb')

# 将修改后的内容写入到文件中
f.write(pickle.dumps(account_dic))
f.close()

检查修改后的结果

import pickle
f = open('account.db','rb')
account_db = pickle.loads(f.read())
print (account_db)

在这里插入图片描述


版权声明:本文为weixin_46108954原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。