第二十二天- 序列化 pickle json shelve
# 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化
# Python中序列化的三种方案:
# 1.pickle python任意数据——》bytes写入⽂件;写好的bytes——》python的数据.
# 2.shelve 简单另类的⼀种序列化⽅案. 可以作为⼀种⼩型的数据库来使⽤
# 3.json 将字典列表转换成字符串,前后端数据交互高频使用的⼀种数据格式
# pickle:
# 写入到文件的是bytes # pickle中的dumps可以序列化⼀个对象.loads可以反序列化⼀个对象
import pickle
class Cat:
def __init__(self,name,color):
self.name = name
self.color =color def chi(self):
print("%s猫会吃老鼠"%(self.name)) c = Cat("加菲","橘色")
# c.chi()
bs = pickle.dumps(c) # 把对象转换成bytes
# print(bs) # b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\x8a\xa0\xe8\x8f\xb2q\x04X\x05\x00\x00\x00colorq\x05X\x06\x00\x00\x00\xe6\xa9\x98\xe8\x89\xb2q\x06ub.' # 把bytes反序列化成对象
cc = pickle.loads(b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\x8a\xa0\xe8\x8f\xb2q\x04X\x05\x00\x00\x00colorq\x05X\x06\x00\x00\x00\xe6\xa9\x98\xe8\x89\xb2q\x06ub.')
cc.chi()
print(cc.name,cc.color) # 加菲猫会吃老鼠 加菲 橘色
# dump load读写文件操作
# dump load ⼀个对象写读到文件
c = Cat("加菲","橘色")
pickle.dump(c,open("cat.dat",mode = 'wb')) # 把对象写到文件 pickle.dump() 注意bytes用wb模式
ccc = pickle.load(open('cat.dat',mode='rb')) # 把对象读取出来 pickle.load() 注意bytes用rb模式
ccc.chi() # 加菲猫会吃老鼠
print(ccc.name,ccc.color) # 加菲 橘色
# pickle用list读写多个对象
c1 = Cat("加菲1","橘色")
c2 = Cat("加菲2","橘色")
c3 = Cat("加菲3","橘色")
c4 = Cat("加菲4","橘色")
c5 = Cat("加菲5","橘色") # lst = [c1,c2,c3,c4,c5]
# f = open('cat.dat',mode='wb')
# pickle.dump(lst,f) # 把lst写到f f = open('cat.dat',mode='rb')
lis = pickle.load(f) # 把lis从f读取出来
for cc in lis:
cc.chi()
# 应用:pickle实现注册登录
import pickle class User:
def __init__(self,username,password):
self.username = username
self.password = password class Client:
# 注册
def regist(self):
uname = input("请输入你的账户:")
pwd = input("请输入你的密码:")
user = User(uname,pwd) # 把uname pwd 传参到User类
pickle.dump(user,open("userinfo",mode='ab')) # 把对象保存到userinfo
print("注册成功!") # 登录
def login(self):
uname = input("请输入你的账户:")
pwd = input("请输入你的密码:")
f = open('userinfo',mode='rb')
while 1:
# 加入try except 当不存在的账户登录时 抛出错误
try:
u = pickle.load(f) # 从userinfo中读取出用户
if u.username == uname and u.password == pwd:
print("登陆成功!")
break
except Exception as e:
print("登录失败!")
break d = Client()
# print("注册")
# d.regist()
# d.regist()
# d.regist()
# print("登录")
# d.login()
# d.login()
# d.login()
# shelve 就是把数据写到硬盘上.操作shelve非常的像操作字典.
import shelve d = shelve.open("test") # 可理解成文件类型的字典
# d['wf'] = '汪峰'
d['wf'] = '王菲'
print(d['wf']) # 汪峰 王菲
d.close()
# 存储一些复杂点的数据
import shelve
d = shelve.open('test')
d['wf'] = {'name':'汪峰','age':47,'wife':{'name':'章子怡','hobby':'拍电影'}}
print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '拍电影'}}
d.close() # 尝试修改
d = shelve.open('test')
d['wf']['wife']['name'] = '小章'
print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '拍电影'}}
d.close()
# 坑 由上可知 直接修改没效果 需用到 writeback
# writeback=True 可动态的把修改的信息写入到⽂件中.
d = shelve.open('test',writeback=True) # 文件类型字典修改时 writeback 把修改回写到文件
d['wf']['wife']['hobby'] = '搓麻将' # 修改vlue
d.close() d = shelve.open('test')
print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '搓麻将'}}
d.close()
# json 前后端交互的纽带
# json全称javascript object notation.翻译js对象简谱.
# json代码(python中的字典)
wf = {
"name":"汪峰",
"age":18,
"hobby":"上头条",
"wife":{
"name":'⼦怡',
"age":19,
"hobby":["唱歌", "跳舞", "演戏"]
}
}
# 直接把字典转化成json字符串
import json
dic = {'a':'一只萝莉','b':'两只萝莉','c':'一群萝莉','d':False,'e':None}
s = json.dumps(dic,ensure_ascii=False) # ensure_ascii 固定套路不转成bytes
print(type(s)) # <class 'str'>
print(s) # {"a": "一只萝莉", "b": "两只萝莉", "c": "一群萝莉", "d": false, "e": null}
# 把json字符串转换成字典
s1 = '{"a": "一只萝莉", "b": "两只萝莉", "c": "一群萝莉", "d": false, "e": null}'
d = json.loads(s1)
print(d) # {'a': '一只萝莉', 'b': '两只萝莉', 'c': '一群萝莉', 'd': False, 'e': None}
print(type(d)) # <class 'dict'>
# 把json写入文件
dic = {'a':'小萝莉','b':'大萝莉','c':'一群萝莉','d':False,'e':None,'wf':{'name':'怒放的生命','hobby':'皮裤'}}
f = open('loli.json',mode='w',encoding='utf-8') # 注意:utf-8格式写入
json.dump(dic,f,ensure_ascii=False,indent=4) # indent=4 缩进4格 等同tab 便于阅读
# 文件中读取json
f = open('loli.json',mode='r',encoding="utf-8")
d = json.load(f)
# print(d)
f.close()
# 把对象转换成json
class Person:
def __init__(self,firstName,lastName):
self.firstName = firstName
self.lastName = lastName p = Person('尼古拉斯','赵四') # 方案一 转化的是字典
s = json.dumps(p.__dict__,ensure_ascii=False)
print(s) # {"firstName": "尼古拉斯", "lastName": "赵四"} # 方案二 自己定义函数
def func(obj):
return {
'firstName':obj.firstName,
'lastName':obj.lastName
} s = json.dumps(p,default=func,ensure_ascii=False)
print(s) # {"firstName": "尼古拉斯", "lastName": "赵四"}
# 函数把字典(json)转换成对象
s = '{"firstName": "尼古拉斯", "lastName": "赵四"}'
def func(dic):
return Person(dic['firstName'],dic['lastName']) p = json.loads(s,object_hook=func) # 字典转换成对象 print(p.firstName,p.lastName)
# 注意.我们可以向同⼀个⽂件中写⼊多个json串.但是读不⾏.
import json
lst = [{'a':1},{'b':2},{'c':3}]
f = open('test.json',mode='w',encoding='utf-8')
for el in lst:
json.dump(el,f)
f.close()
# 若需要读取改用 dumps和loads 循环对每行分别处理
import json
lst = [{"a": 1}, {"b": 2}, {"c": 3}]
# 写⼊
f = open("test.json", mode="w", encoding="utf-8")
for el in lst:
s = json.dumps(el, ensure_ascii=True) + "\n" # 注意dumps这里ensure_ascii是True
f.write(s)
f.close()
# 读取
f = open("test.json", mode="r", encoding="utf-8")
for line in f:
dic = json.loads(line.strip())
print(dic)
f.close()
# configparser模块(参考)
# 模块用于配置⽂件格式与windows ini⽂件类似,可以包含⼀个或多个节(section)每个节可有多个参数(键=值)
# 服务器配置文件
'''
[DEFAULT] [DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[[bitbucket.org bitbucket.org]]
User = hg
[[topsecret.server.com topsecret.server.com]]
Port = 50022
ForwardX11 = no
'''
# ⽤configparser对这样的⽂件进⾏处理
# 初始化
import configparser config = configparser.ConfigParser()
config['DEFAULT'] = {
"sleep": 1000,
"session-time-out": 30,
"user-alive": 999999
}
config['TEST-DB'] = {
"db_ip": "192.168.17.189",
"port": "",
"u_name": "root",
"u_pwd": ""
}
config['168-DB'] = {
"db_ip": "152.163.18.168",
"port": "",
"u_name": "root",
"u_pwd": ""
}
config['173-DB'] = {
"db_ip": "152.163.18.173",
"port": "",
"u_name": "root",
"u_pwd": ""
}
f = open("db.ini", mode="w")
config.write(f) # 写⼊⽂件
f.flush()
f.close()
# 读取文件信息
config = configparser.ConfigParser()
config.read("db.ini") # 读取⽂件
print(config.sections()) # 获取到section. 章节...DEFAULT是给每个章节都配备的信息
print(config.get("DEFAULT", "SESSION-TIME-OUT")) # 从xxx章节中读取到xxx信息
# 也可以像字典⼀样操作
print(config["TEST-DB"]['DB_IP'])
print(config["173-DB"]["db_ip"])
for k in config['168-DB']:
print(k)
for k, v in config["168-DB"].items():
print(k, v)
print(config.options('168-DB')) # 同for循环,找到'168-DB'下所有键
print(config.items('168-DB')) #找到'168-DB'下所有键值对
print(config.get('168-DB','db_ip')) # 152.163.18.168 get⽅法Section下的key对应的value
# 增删改操作
# 先读取. 然后修改. 最后写回⽂件
config = configparser.ConfigParser()
config.read("db.ini") # 读取⽂件
# 添加⼀个章节
# config.add_section("189-DB")
# config["189-DB"] = {
# "db_ip": "167.76.22.189",
# "port": "3306",
# "u_name": "root",
# "u_pwd": "123456"
# }
# 修改信息
config.set("168-DB", "db_ip", "10.10.10.168")
# 删除章节
config.remove_section("173-DB")
# 删除元素信息
config.remove_option("168-DB", "u_name")
# 写回⽂件
config.write(open("db.ini", mode="w"))
第二十二天- 序列化 pickle json shelve的更多相关文章
- 序列化 pickle & json & shelve
把内存数据转成字符,叫序列化,dump,dumps 把字符转成内存数据类型,叫反序列化load,loads dumps:仅转成字符串 dump不仅能把对象转换成str,还能直接存到文件内 json.d ...
- python模块--pickle&json&shelve
使用file文件处理时,写入的必须是str ,否则会报错. 例如:要把一个字典写入文件,写入时会报错 ,就算转换成str格式写入,读取的时候也不能按照dict格式读. >>> inf ...
- Python:序列化 pickle JSON
序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...
- python3之序列化(pickle&json&shelve)
1.pickle模块 python持久化的存储数据: python程序运行中得到了一些字符串,列表,字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据.python ...
- python序列化之pickle,json,shelve
模块 支持方法 说明 json dumps/dump loads/load 只能处理基本数据类型: 用于多种语言间的数据传输: pickle dumps/dump loads/load 支持pytho ...
- day21 pickle json shelve configpaser 模块
1. 序列化:我们在网络传输的时候,需要我们对对象进行处理,把对象处理成方便存储和传输的格式,这个过程就叫序列化 序列化的方法不一定一样,三十目的都是为了方便储存和传输. 在python中有三种序列化 ...
- python之路 序列化 pickle,json
运行代码,毫不留情地得到一个TypeError: Traceback (most recent call last): ... TypeError: <__main__.Student obje ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- Python模块:shutil、序列化(json&pickle&shelve)、xml
shutil模块: 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fscr,fdst [, length]) # 将文件内容拷贝到另一个文件中 import shu ...
随机推荐
- hdoj1072 Nightmare(bfs)
题目大意: 在迷宫中有一个炸弹,过六个单位时间就会爆炸,要你求一个起点到迷宫的终点的最短距离,迷宫中有时间重置器,当你走到这个格子,炸弹的爆炸时间重新置为0,迷宫中标识为墙壁的格子不能走,到达任意一个 ...
- out.print()与out.write()的区别
out对象的类型是JspWriter.JspWriter继承了java.io.Writer类. 1)print方法是子类JspWriter,write是Writer类中定义的方法: 2)重载的prin ...
- Ubuntu 连接手机 不识别设备 -- 解决办法
1.usb线连接手机,输入命令 $ lsusb Bus 004 Device 002: ID 8087:8000 Intel Corp. Bus 004 Device 001: ID 1d6b:000 ...
- Ubuntu18.04 Redis主从复制
1.下载安装redis http://download.redis.io/releases/ 2.建立一个主7060和一个从7061文件 3.在两个文件夹中建立用于存放数据得db文件和存日志得log文 ...
- Sington单例模式(创建型模式)
一.使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性.以及良好的效率. 大多数类用的是常规的构造器,所以往往 ...
- Linux的管道命令
Linux的管道命令 管道命令(Pipe) 管道命令用"|"来表示,管道命令需要接收前一个命令的输出来进行操作,但不能处理前一个命令的错误. //选取界面:cut,grep cut ...
- Spring Boot的Servlet简单使用
当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet.Filter和Servlet规范的所有监听器(如HttpSessionListener监听器). Spri ...
- C#设计模式系列目录
http://www.cnblogs.com/libingql/archive/2012/04/16/2451608.html 抽空,学习,加强!
- 一个非常好用的图片切割工具(c# winform开发)
本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 功能说明 可以设定切割的高度和宽度.切割线可以上下拖动,可以增加一个切割区域,可设定某个区域不参 ...
- django中有外键关系两张表的相互查找方法
两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 1 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列, ...