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)
python(32)——【shelve模块】【xml模块】的更多相关文章
- python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则
python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess ...
- Python常用内置模块之xml模块
xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...
- python之shelve、xml、configparser模块
一.shelve模块 shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型 import shelve ...
- s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译
时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...
- 常用模块:re ,shelve与xml模块
一 shelve模块: shelve模块比pickle模块简单,只有一个open函数,所以使用完之后要使用f.close关闭文件.返回类似字典的对象,可读可写;key必须为字符串,而值可以是pytho ...
- python笔记7 logging模块 hashlib模块 异常处理 datetime模块 shutil模块 xml模块(了解)
logging模块 日志就是记录一些信息,方便查询或者辅助开发 记录文件,显示屏幕 低配日志, 只能写入文件或者屏幕输出 屏幕输出 import logging logging.debug('调试模式 ...
- python configparse模块&xml模块
configparse模块 用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. [DEFAULT] serveraliveinterval = ...
- shelve模块 xml模块
# import shelve# f=shelve.open('db.shl')# # f['stu1']={'name':'alex1','age':28}# # f['stu2']={'name' ...
- python运维开发(六)----模块续
内容目录 反射 模块 os模块 sys模块 md5加密模块 re正则匹配模块 configparse模块 xml模块 shutil模块 subprocess模块 反射 利用字符串的形式去对象(模块)中 ...
- logging模块、shutil模块、subprocess模块、xml模块
logging模块 shutil模块 subprocess模块 xml模块 logging模块 函数式简单配置 import logging logging.debug('debug message' ...
随机推荐
- 大数据入门到精通11-spark dataframe 基础操作
// dataframe is the topic 一.获得基础数据.先通过rdd的方式获得数据 val ny= sc.textFile("data/new_york/")val ...
- eclipse配置Servlet连接Mysql要注意的几个地方
用Servlet即把jdbc那套放到继承于HttpServlet的派生类之内,那段代码很简单 protected void doPost(HttpServletRequest request, Htt ...
- sh 了解
shell 脚本中 `dirname $0` 在命令行状态下单纯的执行时没有意义的,因为他返回当前路径的“.”. 在脚本中他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行的程序的相对位置 ...
- 445. Add Two Numbers II 链表中的数字求和
[抄题]: You are given two non-empty linked lists representing two non-negative integers. The most sign ...
- [leetcode]297. Serialize and Deserialize Binary Tree 序列化与反序列化二叉树
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [leetcode]44. Wildcard Matching万能符匹配
Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '? ...
- thinkphp用ajax遇到的坑——ajax请求没有反应
view视图的 html 的 js 代码如下, $.ajax({ url:"test",//这里指向的就不再是页面了,而是一个方法. ...
- github windows配置以及ssh生成 Permission denied (publickey)
1:进入cmd命令下,或者可以使用GIt工具 (如果出现了 Permission denied 或者配置多个SSH Key跳第6步) git工具 下载地址:https://git-scm.com ...
- 3U - 算菜价
妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐.现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵. Input 输入含有一些数据组,每组数据包括菜种( ...
- 哪些人才适合转行学习UI设计?
最近有很多学员问,怎么才知道自己适不适合学习UI设计,在从事IT教育行业多年以来,也确实碰到好多人咨询这个问题,今天就和大家说下,哪些人才适合转行学习UI设计?(转行必看) 1 平面设计师.网页设计师 ...