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()                 
                 

总结:

​ 配置文件是非常常用的程序扩展方法,其实使用起来非常简单

posted on 2018-10-17 21:13  撩与诗人  阅读(85)  评论(0编辑  收藏  举报