2018.10.17python学习第二十一天
序列化
什么是序列块?
指的是内存中的数据结构转化为中间格式,并存储到硬盘中
反序列化:将硬盘上存储的中间格式数据,在还原为内存中的数据
为什么要序列化?
就是为了将数据永久存储,之前学过的文件也能完成持久化存储,但是操作起来非常麻烦
pickle 模块
pickle.dump: 序列化
pickle.load: 反序列化
pickle.dumps: 序列化
pickle.loads: 反序列化
# dump vs dumps load vs loads
带s的是帮你封装了write & read 功能,使用更加方便
eg1:将 name='agon' ,password='123', sex= 'female' 存储到文件中
方式一:
import pickle
user={'name':'agon','password':'123,'gender':'female'}
with open('userdb.txt','wt',encoding='utf-8') as f:
userbytes=pickle.dumps(user)
f.write(userbytes)
方式二:
import pickle
user={'name':'agon','password':'123,'gender':'female'}
with open('userdb.txt','wt',encoding='utf-8') as f:
pickle.dump(user,f)
eg2:将file 'userdb.txt' 从文件中反序列出来
方式一:
import pickle
with open('userdb.txt','rt',encoding='utf-8') as f:
userbytes=f.read()
user=pickle.loads(userbytes)
方式二:
import pickle
with open('userdb.txt','rt',encoding='utf-8') as f:
user=pickle.load(f)
总结:
pickle就是一种序列化的模块,只有python能够解析
shelve 模块
shelve模块,也可用于序列化,与pickle不同之处在于:
1.不需要关心文件的模式是什么,直接把他当陈过一个dict来看
2.可以直接对数据进行修改,而不用覆盖原来的数据
3.pickle 修改数据的化,只能用wb模式来覆盖,而且只能读到第一次读入的数据
序列化:
import shelve
user={'name':'agon'}
s=shelve.open('userdb.shv')
s['user']=user
s.close
反序列化
import shelve
s=shelve.open('userdb.shv'.writeback=True)
print(s['user'])
s.close
json 模块
之前有讲到的pickle & shelve模块序列化后得到的数据,只有python才能解析,但是通常企业
开发不可能做一个单机程序,都需要联网进行计算机建的交互,我们必须保证这数据能够跨平台使
用。
json (java script object notation) java脚本对象表示法。
对于开发而言,json就是一种通用的数据格式,任何一种语言都能解析。
json中的数据类型:
json | python |
---|---|
{} | dict |
[] | list |
string " " | str ' ' |
int/float | int/float |
true/false | True/ False |
null | None |
json 不支持set和duple
json的语法规范:
1.最外层必须是 { } or [ ],最外层用{}较多
2.string必须是双引号 “ ”
eg:json数据格式
{
“user":[{"name":"agon"},{"name":"aaa"}]
}
json模块的核心功能
json.dump 序列化
json.dumps 序列化
json.load 反序列化
json.load 反序列化
#和pickle一样,带s的是帮你封装了write & read 功能,使用更加方便
eg1:将json数据mydic={”user":[{"name":"agon"},{"name":"aaa"}]} 序列化
方式一:
import json
mydic={”user":[{"name":"agon"},{"name":"aaa"}]}
with open('b.json','wt',encoding='utf-8') as f:
res=json.dumps(mydic)
f.write(res)
方式二:
import json
mydic={”user":[{"name":"agon"},{"name":"aaa"}]}
with open('b.json','wt',encoding='utf-8') as f:
json.dump(mydic,f)
eg2:将文件中的json数据反序列化
方式一:
import json
with open('b.json','rt',encoding='utf-8') as f:
readbytes=f.read()
json.loads(readbytes)
方式二:
import json
with open('b.json','rt',encoding='utf-8') as f:
json.load(f)
总结:
json就是一种数据格式,能被任何语言识别
xml 模块
xml (Extensible markup language) 可扩展的标记语言
也是一种通用的数据格式,可以跨平台
xml的语法规范:
1.一个标签: < name/>
2.两个标签:< name> < /name>
3.任何的其实标签都有一个结束标签。
4.标签必须是按合适的顺序进行嵌套,所以结束标签中同时表示其实和结束i拗钱。这种语
法是再大于符号(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条
></百度百科词条>。
5.所有的特性都必须有值。
6.所有的特性都必须再值的周围嘉善过一个双引号。
import xml.etree.ElementTree as ElementTree #表示节点树
# 解析 d.xml
tree = ElmentTree.parse('d.xml')
# 获取根标签
rootTree = tree.getroot()
三种获取标签的方式
方式一:
# 获取所有人的年龄 iter是用于再全文范围获取标签
for item in rootTree.iter('age'):
# 一个标签的三个组成部分
print(item.tag) # 标签名
print(item.attrib) # 标签的属性
print(item.text) # 文本内容
方式二:
# 从当前标签的子标签中找到一个名称为age的标签 如果有多个 找到的是第一个
print(rootTree.find('age').attrib
方式三:
#从当前的子标签中找到所有名称为age的标签
print(rootTree.findall('age'))
获取单个属性
stu = rootTree.find('stu')
print(stu.get('age'))
print(stu.get('name'))
删除子标签
rootTree.remove(stu)
添加子标签
#先创建一个子标签
newTag = Element.Tree.Element('this is new tag',{'attrib':'value'})
rootTree.append(newTag)
#写入文件
tree.write('f.xml',encoding='utf-8')
总结:
Element常用方法
getchildren() 获取所有子标签
find 从子标签中获取名字匹配的第一个子标签
findall 从子标签中获取匹配名字的所有子标签
iter 从子全文中获取名字匹配的所有标签,返回迭代器
get 获取指定属性的值
append 添加子标签
remove 删除子标签
elementTree常用方法
parse 文本文件转对象
dump 对象转文本
write 写入
getroot 获取根标签
configparser 模块
配置文件解析模块
运行程序是一些参数需要用户来决定,这些参数称之为配置信息,配置信息通常就放在一
个文件中
为什么要配置文件?
一些parameter我们不再code中写死,这样扩展性太低,修改需求时必须修改源代码,太
麻烦
配置文件主要内容
section 分区
option 选项,就是一个key=value形式
常用功能
get 用来从配置文件中获取一个配置选项
read
set
sections
options
import configparser
# 创建一个解析器
config = confingparser.ConfigParser()
#读取并解析test.cfg
config.read('test.cfg',encoding='utf-8')
# 获取需要的信息:
# 获取所有分区
print(config.sections())
# 获取所有选项
print(config.options('user'))
# 获取某个选项的值
print(config.get('path','DB_PATH))
# get返回的都是字符串类型,如果需要转换类型,直接用get+对应的类型(bool,int,float)
print(config.getint('user','age'))
print(config.get('user','age'))
#是否有某个选项
config.has_option()
#是否有某个分区
config.has_section()
总结:
配置文件是非常常用的程序扩展方法,其实使用起来非常简单