一、 shelve模块
- json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题。
- shelve模块是一个简单的key,values将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,是pickle 更上一层的封装。
- shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象
- 可读可写
- key必须为字符串,而值可以是python所支持的数据类型
#持久化储存
import shelve
f = shelve.open('shelve_test')
f['stu1_info'] = {'name': 'alex', 'age': ''}
f['stu2_info'] = {'name': 'xxxx', 'age': ''}
f['stu3_info'] = {'name': 'rrrr', 'age': ''}
f.close()
#直接对文件句柄[key]操作,就可以存入数据
#且重要的是它还会直接在打开的当前目录生成三个文件:
shelve_test.bak
shelve_test.dat
shelve_test.dir 其中shelve_test.dat 存储的就是b字节数据类型的数据,
bak和dir后缀的就可能是和数据库相关的设计缓存之类的东西了。
注:文件生成后,我们可以将前面的这一段生成shelve_test的代码先行注释掉,不影响下面的继续测试操作。
#解析文件内容
import shelve
f = shelve.open('shelve_test')
data = f['stu1_info']
f.close()
print(type(data), data) #执行结果:
<class 'dict'> {'name': 'alex', 'age': ''}
#通过get来解析文件内容
import shelve
f = shelve.open('shelve_test')
date = f.get('stu1_info')['age']
f.close()
print(date) #执行结果:
18
二、xml模块
- xml,可扩展标记语言,用来传输和储存数据
- xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单
1. xml的格式如下,是通过<>节点来区别数据结构
(xml数据:标签语言(文档树)
<data>
<country name="Singapore">
<rank updated="yes">5</rank>
<year updated="yes">2013</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="China">
<rank updated="yes">1</rank>
<year updated="yes">2016</year>
<gdppc>1051100</gdppc>
<neighbor direction="E" name="Korea" />
<neighbor direction="W" name="Japan" />
</country>
</data>
2. xml中节点Element类的函数
tag 当前节点标签名
attrib 当前节点属性
text 当前节点内容
append 添加一个子节点
clear 清空节点
extend 为当前节点添加 n 个子节点
find 获取第一个寻找到的子节点
findall 获取所有的子节点
findtext 获取第一个寻找到的子节点的内容
get 获取当前节点的属性
insert 在当前节点创建子节点,然后插入指定位置
items 获取当前节点的所有属性,和字典中的items一样,内容都是健值对
iter 在根据节点名称寻找所有指定的节点,并返回一个迭代器
iterfind 获取所有指定的节点,并放在一个迭代器中
itertext 在子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器
keys 获取当前节点的所有属性的 key
makeelement 创建一个新节点
remove 删除某个节点
set 设置当前节点属性
3. xml解析(针对1中的xml文件进行操作)
#ElementTree.parse("file_path")函数
import xml.etree.ElementTree as ET
tree = ET.parse('output') #打开xml文件并且解析,返回一个xml.etree.ElementTree.ElementTree对象
root = tree.getroot() #获取xml的根节点
print(root.tag) #调用tag属性 #执行结果:data
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for i in root: #对根节点进行遍历,遍历结果是地址,即其子对象,调用其tag属性
print(i.tag) #执行结果:
country
country
country
#对第三级子节点进行遍历,并调用其tag属性
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for i in root:
for j in i:
print(j.tag)
#执行结果:
rank
year
gdppc
neighbor
neighbor
rank
year
gdppc
neighbor
rank
year
gdppc
neighbor
neighbor
#调用attrib属性(打印标签对应的属性内容)
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for i in root:
print(i.attrib) #执行结果:
{'name': 'Liechtenstein'}
{'name': 'Singapore'}
{'name': 'China'}
#调用text属性(打印标签包裹的内容)
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for i in root:
for j in i:
print(j.text)
#执行结果:
#执行结果:
21
2010
141100
None
None
5
2013
59900
None
1
2016
1051100
None
None
#只遍历某一节点
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for note in root.iter("rank"):
print(note.tag,note.attrib,note.text) #执行结果:
rank {'updated': 'yes'} 21
rank {'updated': 'yes'} 5
rank {'updated': 'yes'} 1
#删除某一节点(删除排名大于20的城市的所有内容)
import xml.etree.ElementTree as ET
tree = ET.parse('output')
root = tree.getroot()
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 20:
root.remove(country)
tree.write('output') #操作完记得进行写操作
4. 创建XML数据
思路:创建一个根节点标签,插入多个子节点,创建完之后要生成文档树
import xml.etree.ElementTree as ET new_xml = ET.Element('namelist') name = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
age = ET.SubElement(name, 'age', attrib={'checked':'no'})
sex =ET.SubElement(name, 'sex')
sex.text = 'female' name2 = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
age = ET.SubElement(name2, 'age')
sex =ET.SubElement(name2, 'sex')
age.text = '' et = ET.ElementTree(new_xml) #生成文档对象
et.write('test.xml', encoding = 'utf-8', xml_declaration=True)
ET.dump(new_xml) #打印生成格式 #执行结果:(没有缩进)
<namelist><name enrolled="yes"><age checked="no" /><sex>female</sex></name><name enrolled="yes"><age>16</age><sex /></name></namelist>
5. 增加缩进
import xml.etree.ElementTree as ET
from xml.dom import minidom def prettify(elem):
"""
将节点转换成字符串,并添加缩进
"""
#返回该对象的字符串表示
rough_string = ET.tostring(elem, 'utf-8')
print(type(rough_string))
#从xml字符串得到dom对象
reparsed = minidom.parseString(rough_string)
print(type(reparsed))
return reparsed.toprettyxml(indent="\t") new_xml = ET.Element('namelist') name = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
age = ET.SubElement(name, 'age', attrib={'checked':'no'})
sex =ET.SubElement(name, 'sex')
sex.text = 'female' name2 = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
age = ET.SubElement(name2, 'age')
sex =ET.SubElement(name2, 'sex')
age.text = '' newStr=prettify(new_xml) file = open('test.xml', 'w',encoding = 'utf-8')
file.write(newStr)
file.close()
ET.dump(new_xml)