python(32)——【shelve模块】【xml模块】

时间:2023-03-08 21:09:43
python(32)——【shelve模块】【xml模块】

一、 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)