# 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化
# 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. apache测试网页执行效率

    apache软件下有一个测试网页访问速度的工具ab.exe,位于apache的bin目录下,windows下使用命令行进入bin目录,执行ab.exe -n 10000 -c 10 http://12 ...

  2. Codeforces Round #452 (Div. 2) C. Dividing the numbers(水)

    C. Dividing the numbers Petya has n integers: 1, 2, 3, ..., n. He wants to split these integers in t ...

  3. 2018年Android面试题含答案--适合中高级(下)

    这里是我整理出来的面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875   1.A ...

  4. Flask从入门到精通之跨站请求伪造保护

    默认情况下,Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击.恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF ...

  5. POJ 1046

    #include<iostream> using namespace std; #define MAXN 16 #define inf 100000000 struct node { in ...

  6. JavaScript函数理解

    本文参考自简书javaScript之函数详解 这里从函数的构造函数开始. 在js中,函数都是对象,它们都是Function构造函数的实例.因此,类似Java中的对象,函数名可以理解为指向该Functi ...

  7. 剑指offer五十之数组中重复的数字

    一.题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  8. DOM时钟

    使用JS使时钟运动 DOM运动,主要操作css3中transform:rotate(): 计时器setInterval(),setTimeout(),如何防止时钟偷停; 时钟的时针.分针.秒针的运动的 ...

  9. jython实现java运行python代码

    Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现.最近的一个项目需要将python代码转换成java实现,所以用了一 ...

  10. 删除Open with Atom右键菜单

    特别特别讨厌Atom的右键菜单,叕没有设置项可以去掉,烦!安装完RegScanner v2.15汉化版之后,开始搜索删除Atom的右键菜单 1.打开E:\RegScanner2.加载配置文件 E:\R ...