# 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化
# 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. maven项目发布到tomcat后没有lib目录解决方案

    maven项目放入tomcat中时,总是报错,而且这些jar都是真实存在的,错误如下: maven eclipse tomcat java.lang.ClassNotFoundException: o ...

  2. 三:MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下 <?xml version="1. ...

  3. Python小白学习之路(十三)—【递归调用】

    一.递归调用定义 在函数内部,可以调用其他函数. 如果在调用一个函数的过程中直接或间接调用自身本身,则称为递归调用 从某种意义上来说,递归调用可以实现无限循环 二.递归调用的特性 必须有一个明确的结束 ...

  4. 在vue项目中使用swiper2.7.6

    $ npm install swiper@2.7.6 --save-dev npm WARN rollback Rolling back node-pre-gyp@0.10.0 failed (thi ...

  5. java日期加减操作

    1.用java.util.Calender来实现 Calendar calendar=Calendar.getInstance();      calendar.setTime(new Date()) ...

  6. 5、xamarin.android 中如何对AndroidManifest.xml 进行配置和调整

    降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份. 我们在翻看一些java的源码经常会说我们要在AndroidManifest.xml 中添加一些东西.而我们使用xamari ...

  7. (转)python 之路,200行Python代码写了个打飞机游戏!

    原文:https://www.cnblogs.com/alex3714/p/7966656.html

  8. 【Git】学习记录

    配置git git config --global user.name "用户名或者用户ID" git config --global user.email "邮箱&qu ...

  9. Cocos2d-x游戏导出android工程,提取cocos的so文件

      Cocos2d-x游戏导出android工程,提取cocos的so文件   原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件, 使用ndk ...

  10. java学习-AES加解密之AES-128-CBC算法

    AES算法简介 AES是一种对称加密算法,或称分组对称加密算法.  是Advanced Encryption Standard高级加密标准,简称AES AES的基本要求是,采用对称分组密码体制.分组密 ...