博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pickle
阅读量:5760 次
发布时间:2019-06-18

本文共 2567 字,大约阅读时间需要 8 分钟。

pickle⽤起来很简单说⽩了就是把我们的python对象写入到⽂件中的⼀种解决方案.
但是写入到⽂件的是bytes. 所以这东⻄不是给人看的是给机器看的.
import pickle
 
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def catchMouse(self):
        print(self.name, "抓老鼠")
c = Cat("jerry", 18)
 
bs = pickle.dumps(c) # 序列化⼀个对象.
print(bs) # ⼀堆⼆进制. 看不懂
 
能不能将类干掉呢?
import pickle
 
将类注释掉
# class Cat:
#     def __init__(self, name, age):
#          = name
#         self.age = age
#
#     def catchMouse(self):
#         print(self.name, "抓老鼠")
# c = Cat("jerry", 18)
#
# bs = pickle.dumps(c) # 序列化⼀个对象.
# print(bs) # ⼀堆⼆进制. 看不懂
 
 
cc = pickle.loads(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\x12ub.') # 把⼆进制反序列化成我们的对象
print(cc)
cc.catchMouse()    
结果:报错
不能将类给去掉,因为pickle.dumps是序列化一个对象,而不是一个类,所以可以将对象c = Cat("jerry", 18) 注释掉,而不能将类class Cat:注释掉
 
pickle中的dumps可以序列化⼀个对象. loads可以反序列化⼀个对象我们使用dump还可以直接把一个对象写入到⽂件中
# f = open("cat", mode="wb")   #要用wb因为是写入bit文件
# pickle.dump(c, f) # 写入到⽂件中
# f.close()
 
f = open("cat", mode="rb")  #rb读取bit文件
cc = pickle.load(f) #从⽂件中读取对象
cc.catchMouse() #要保证代码中要有类才能读取对象
pickle还⽀持多个对象的写出.
import pickle
 
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def catchMouse(self):
        print(self.name, "抓老鼠")
 
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] #放入3个对象
f = open("cat", mode="wb")
for el in lst:
    pickle.dump(el, f) # 写⼊到文件中
f.close()
f = open("cat", mode="rb")
for i in range(len(lst)):
    cc = pickle.load(f) # 从⽂件中读取对象
    cc.catchMouse()
 
结果:
jerry 抓老鼠
tommy 抓老鼠
alpha 抓老鼠
但是这样写并不够好因为读的时候并不能知道有多少对象要读.这里记住,不能一行一行的读。那真的要写入或者读取多个内容怎么办?
很简单.装list里。然后读取和写入都用list
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] #放入3个对象
f = open("cat", mode="wb")
pickle.dump(lst, f) # 写⼊到文件中
f.close()
f = open("cat", mode="rb")
ll = pickle.load(f)
for el in ll:
    el.catchMouse()
注册系统
import  pickle
 
class User:
    def __init__(self,username,password):
        self.username = username
        self.password = password
 
class client:
    def regist(self):
        uname = input("please input your name:")
        pwd = input("please input your password:")
        user = User(uname,pwd)  #制造对象
        pickle.dump(user,open("userinfo",mode="ab")) #将对象写入userinfo
        print("regist successful!!!")
    def login(self):
        uname = input("please input your name:")
        pwd = input("please input your 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
c = client()
 
 
c.regist() #注册
c.login()  #登陆

转载于:https://www.cnblogs.com/BALCKLIGHTNING/p/9965850.html

你可能感兴趣的文章
1月9日云栖精选夜读 | Mars 算法实践——人脸识别
查看>>
SparkSQL Catalyst解析
查看>>
jSearch(聚搜) 1.0.0 终于来了
查看>>
盘点2018云计算市场,变化大于需求?
查看>>
极光推送(一)集成
查看>>
MySQL 8.0 压缩包版安装方法
查看>>
@Transient注解输出空间位置属性
查看>>
Ansible-playbook 条件判断when、pause(学习笔记二十三)
查看>>
5种你未必知道的JavaScript和CSS交互的方法(转发)
查看>>
线程进程间通信机制
查看>>
galera mysql 多主复制启动顺序及命令
查看>>
JS prototype 属性
查看>>
中位数性质——数列各个数到中位数的距离和最小
查看>>
WebApp之Meta标签
查看>>
添加Java文档注释
查看>>
Python3批量爬取网页图片
查看>>
iphone-common-codes-ccteam源代码 CCEncoding.m
查看>>
微信公众平台开发(96) 多个功能整合
查看>>
[转]MVC4项目中验证用户登录一个特性就搞定
查看>>
用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版
查看>>