# 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化
# 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的更多相关文章

  1. 序列化 pickle & json & shelve

    把内存数据转成字符,叫序列化,dump,dumps 把字符转成内存数据类型,叫反序列化load,loads dumps:仅转成字符串 dump不仅能把对象转换成str,还能直接存到文件内 json.d ...

  2. python模块--pickle&json&shelve

    使用file文件处理时,写入的必须是str ,否则会报错. 例如:要把一个字典写入文件,写入时会报错 ,就算转换成str格式写入,读取的时候也不能按照dict格式读. >>> inf ...

  3. Python:序列化 pickle JSON

    序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...

  4. python3之序列化(pickle&json&shelve)

    1.pickle模块 python持久化的存储数据: python程序运行中得到了一些字符串,列表,字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据.python ...

  5. python序列化之pickle,json,shelve

    模块 支持方法 说明 json dumps/dump loads/load 只能处理基本数据类型: 用于多种语言间的数据传输: pickle dumps/dump loads/load 支持pytho ...

  6. day21 pickle json shelve configpaser 模块

    1. 序列化:我们在网络传输的时候,需要我们对对象进行处理,把对象处理成方便存储和传输的格式,这个过程就叫序列化 序列化的方法不一定一样,三十目的都是为了方便储存和传输. 在python中有三种序列化 ...

  7. python之路 序列化 pickle,json

    运行代码,毫不留情地得到一个TypeError: Traceback (most recent call last): ... TypeError: <__main__.Student obje ...

  8. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  9. Python模块:shutil、序列化(json&pickle&shelve)、xml

    shutil模块: 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fscr,fdst [, length])   # 将文件内容拷贝到另一个文件中 import shu ...

随机推荐

  1. Exploit之初识Linux下缓冲区溢出

    本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责. 0×01 前言 1 ...

  2. 【zookeeper】Apache curator的使用及zk分布式锁实现

    上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...

  3. php curl 伪造IP来源的实例代码

    来源:http://www.jb51.net/article/31694.htm curl 它不但可以模仿用户登录,还可以模仿用户IP地址哦,为伪造IP来源,本实例仅供参考哦 //伪造ip ; $i ...

  4. 【JS深入学习】——函数创建和重载

    今天做一个关注/取消的功能,由于需要向后台发送请求,想通过控制用户点击发送的频次减少不必要的请求,即在一定时间内,用户点击多次但只发送一次数据,自然而然想到了使用[函数节流]. function th ...

  5. MVC Filter中加入验证并跳转

    public class BuildingFilter : ActionFilterAttribute { /// <summary> /// 验证 Building Cookie add ...

  6. iOS 关于布局问题的一些认识

    ///更新约束和布局 更新约束布局相关的API - (void)updateConstraintsIfNeeded  调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用upda ...

  7. php7 引用成为一种类型

    <?php $a= ref_count= $b=$a; is_ref= ref_count= $c=&$a; is_ref= ref_count 即a c 共用一个zval, b单独用一 ...

  8. How to manage IntelliJ IDEA projects under Version Control Systems

    如何在版本控制系统中管理 IntelliJ IDEA 项目文件 IntelliJ IDEA 设置详细,功能强大.在实际工作中,我们有时会遇到跟同事共享项目文件的情况. 那么,有哪些项目文件应该加入到版 ...

  9. easyui 中iframe嵌套页面,提示弹窗遮罩的解决方法,parent.$.messager.alert和parent.$.messager.confirm

    项目中用到easyui 布局,用到north,west,center三个区域,且在center中间区域嵌入iframe标签.在主内容区做一些小提示弹窗(例如删除前的弹窗提示确认)时,会遇到遮罩问题,由 ...

  10. 解决Mysql Workbench的Error Code: 1175错误 无法删除数据

    使用workbench,如果你要批量更新或删除数据,一般会报“ Error Code: 1175 You are using safe update mode and you tried to upd ...