一、 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': '18'} f['stu2_info'] = {'name': 'xxxx', 'age': '19'} f['stu3_info'] = {'name': 'rrrr', 'age': '17'} 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': '18'}
#通过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 = '16' 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=" ") 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 = '16' newStr=prettify(new_xml) file = open('test.xml', 'w',encoding = 'utf-8') file.write(newStr) file.close() ET.dump(new_xml)