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': '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
View Code

 

 

#调用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
View Code

 

#只遍历某一节点
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="\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 = '16'

newStr=prettify(new_xml)

file = open('test.xml', 'w',encoding = 'utf-8')
file.write(newStr)
file.close()
ET.dump(new_xml)

 

posted @ 2019-03-12 11:27  小伙郭  阅读(226)  评论(0编辑  收藏  举报