第二十一天 PYTHON学习

Posted runjam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二十一天 PYTHON学习相关的知识,希望对你有一定的参考价值。

【今日学习】

一、什么是序列化?

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

二、为什么要序列化?

1:持久保存状态【硬盘存】

需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,‘状态‘会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

具体的来说,你玩使命召唤闯到了第13关,你保存游戏状态,关机走人,下次再玩,还能从上次的位置开始继续闯关。或如,虚拟机状态的挂起等。

2:跨平台数据交互【网络传】

序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

 

 

       json模块【转化成str类型】(优先掌握)

序列化与反序列化一:

json.dumps   json.loads  是一对

序列化:

dic={‘name‘:‘egon‘,‘age‘:18}

with open(‘db.json‘,‘w‘,encoding=‘utf-8‘) as f:

res = json.dumps(dic)

f.write(res)

print(res,type(res))

结果

{"name": "egon", "age": 18} <class ‘str‘>

#json格式全都是双引号,如果不是双引号,反序列化json就识别不了

#一个数据结构dump一次就行了,不要用‘a.txt ’去添加

反序列化:

    with open(‘db.json‘,‘r‘,encoding=‘utf-8‘) as f:
data=f.read()
res=json.loads(data)
print(res)

结果
{‘name‘: ‘egon‘, ‘age‘: 18}

序列化与反序列化二:
简化版
json.dump   json.load  是一对
序列化
import json
dic = {‘name‘: ‘egon‘, ‘age‘: 18}
with open(‘db1.json‘,‘w‘,encoding=‘utf-8‘) as f:
json.dump(dic,f)
反序列化
import json
dic = {‘name‘: ‘egon‘, ‘age‘: 18}
with open(‘db1.json‘,‘r‘,encoding=‘utf-8‘) as f:
print(json.load(f))

优点:数据跨平台较好
缺点:有些python数据类型不能识别,只能识别以下图片上数据类型
没有元组和集合

技术分享图片

pickle模块(了解)【转化成bytes类型】

把所有的数据类型存成bytes类型,读也需要用bytes类型去读

优点:能识别所有python数据类型,能把所有数据类型序列化,用法与json类似

缺点:也是最致命缺点,只能识别python,跨平台较差

# 用户注册后得到的数据
name = "高跟"
password = "123"
height = 1.5
hobby = ["吃","喝","赌","飘",{1,2,3}]


# with open("userdb.txt","wt",encoding="utf-8") as f:
# text = "|".join([name,password,str(height)])
# f.write(text)

# pickle支持python中所有的数据类型
user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}


# 序列化的过程
# with open("userdb.pkl","ab") as f:
# userbytes = pickle.dumps(user)
# f.write(userbytes)


# 反序列化过程
# with open("userdb.pkl","rb") as f:
# userbytes = f.read()
# user = pickle.loads(userbytes)
# print(user)
# print(type(user))
#

#dump 直接序列化到文件
# with open("userdb.pkl","ab") as f:
# pickle.dump(user,f)

# #load 从文件反序列化
with open("userdb.pkl","rb") as f:
user = pickle.load(f)
print(user)

shelve模块(了解)

也能像pickle序列化所有python数据类型,比pickle更方便
info1={‘name‘:‘egon‘,‘age‘:18}
info2={‘name‘:‘run‘,‘age‘:19}
import shelve
d=shelve.open(‘db.shv‘)
d[‘egon‘]=info1
d[‘run‘]=info2
d.close()

import shelve
d=shelve.open(‘db.shv‘)
# d[‘egon‘]
# d[‘run‘]
print(d[‘egon‘])
print(d[‘run‘])


import shelve
d=shelve.open(‘db.shv‘,writeback=True)
d[‘egon‘][‘age‘]=20
d[‘run‘][‘age‘]=18
print(d[‘egon‘])
print(d[‘run‘])
xml模块(了解)
古老的用法
也是将内存中数据储存起来或传输出去,将数据组织起来


# 查
# 三种查找节点的方式
# 第一种
# import xml.etree.ElementTree as ET
# tree=ET.parse(‘a.xml‘)
# root=tree.getroot()
# res=root.iter(‘year‘)
# # 会在整个树中查找,而且是查找所有
# print(res)
# for item in res:
# print(‘*********************‘)
# print(item.tag)
# print(item.attrib)
# print(item.text)

# 第二种:
# res=root.find(‘country‘)
# # 只能在当前元素下一级查找,并且找到一个就结束
# print(item.tag)
# print(item.attrib)
# print(item.text)

# 第三种
# cy=root.findall(‘country‘)只能在当前元素下一级查找
# # print(cy)
# for item in cy:
# print(item.tag)
# print(item.attrib)
# print(item.text)

# 改:
# import xml.etree.ElementTree as ET
# tree=ET.parse(‘a.xml‘)
# root=tree.getroot()

# for year in root.iter(‘year‘):
# year.text=str(int(year.text)+10)
# year.attrib={‘update‘:‘year‘}
# tree.write(‘a.xml‘)
# # 增
# import xml.etree.ElementTree as ET
# tree=ET.parse(‘a.xml‘)
# root=tree.getroot()
# for country in root.iter(‘country‘):
# year=country.find(‘year‘)
# if int(year.text)> 2020:
# print(country.attrib)
# ele=ET.Element(‘run‘)
# ele.attrib={‘nb‘:‘shuai‘}
# ele.text=‘ok‘
# country.append(ele)
# tree.write(‘a.xml‘)


# 删
# import xml.etree.ElementTree as ET
# tree=ET.parse(‘a.xml‘)
# root=tree.getroot()
# for country in root.iter(‘country‘):
# year=country.find(‘year‘)
# if int(year.text)> 2020:
# # print(country.attrib)
# country.remove(year)
# tree.write(‘a.xml‘)


configparser模块
import configparser
# 取值
# import configparser
# config=configparser.ConfigParser()
# config.read(‘my.ini‘)
# secs=config.sections()
# print(secs)
# print(config.options(‘run‘))
#
# print(config.get(‘run‘,‘age‘))
# print(config.getboolean(‘run‘,‘is_husband‘))
# print(config.getfloat(‘run‘,‘salary‘))
 

                                                                              【今日领悟】
1.json是最常用的序列化与反序列化模块,其它类型的模块常用部分熟悉就行
2.需要在实际按例中去应用才能体会这几个模块的不同

 

 

   








































































































































































以上是关于第二十一天 PYTHON学习的主要内容,如果未能解决你的问题,请参考以下文章

Python学习第二十一天 异常处理

2018.10.17python学习第二十一天

python 学习第二十一天,django知识

python学习第二十一天:类与对象,继承与派生

python学习手册:第二十一章——模块:宏伟蓝图

Python学习笔记第二十一周