pickle
2018-11-20 03:25:30来源:博客园 阅读 ()
一、序列化
在存储数据或者网络传输数据的时候,需要对对象进行处理。把对象处理成方便存储和传输的数据格式。这个过程叫序列化。
不同的序列化,结果也不同,但目的是一样的。都是为了存储和传输。
在python中存在三种序列化的方案:
- pickle:可将python中的任意数据类型转化成bytes并写入到文件中,同样也可以把文件中写好的bytes转换回我们python的数据
- shelve:简单另类的一种序列化的方案。有点儿类似redis,可以作为一种小型的数据库来使用
- json:将python中常见的字典、列表转化成字符串。是目前前后端数据交互使用频率最高的一种数据格式
二、pickle
把python对象写入到文件中的一种解决方案,但写入到文件的是bytes.
1. dumps
将python对象序列化为bytes类型
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) c = Cat("jerry", 5) bs = pickle.dumps(c) print(bs) # b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00jerryq\x04X\x03\x00\x00\x00ageq\x05K\x05ub.'
2. loads
将bytes反序列化为python对象。注:反序列化为对象后,对象定义代码必须存在,否则无法使用对象
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) bs = b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00jerryq\x04X\x03\x00\x00\x00ageq\x05K\x05ub.' cc = pickle.loads(bs) print(cc.name, cc.age) # jerry 5
3. dump &load
- dump:将python对象序列化后写入到文件中
- load:从文件中读取bytes,并反序列化为对象
- 对于读写多对象,由于读取时不知文件中写入了多少个对象,导致不好读取,所以一般采用把对象先装进list,然后把list写入至文件中,读取后遍历list即可拿到对象
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) lst = [Cat("jerry", 5), Cat("tomy", 6), Cat("alpha", 7)] with open("cat", mode="wb") as f: pickle.dump(lst, f) with open("cat", mode="rb") as f: ret = pickle.load(f) for el in ret: el.eat() 结果: jerry抓老鼠 tomy抓老鼠 alpha抓老鼠
4. 应用
注册登录程序
import pickle class User(object): def __init__(self, username, password): self.username = username self.password = password class Client(object): def regist(self): uname = input("username: ") pwd = input("password: ") user = User(uname, pwd) pickle.dump(user, open("userinfo", mode="wb")) print("regist successful!") def login(self): uname = input("username: ") pwd = input("password: ") f = open("userinfo", mode="rb") while 1: try: u = pickle.load(f) if u.username == uname and u.password == pwd: print("login successful!") break except Exception as e: print("login failed!") break def run(self): self.regist() self.regist() self.login() if __name__ == "__main__": c = Client() c.run()
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Python之对象持久化笔记 2019-08-13
- 原创:Python编写通讯录,支持模糊查询,利用数据库存储 2019-07-24
- 三次登入冻结操作 2019-05-23
- 生成器 2019-05-23
- REST Framework 处理一个超链接序列化问题 2019-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash