我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)
shelve模块
shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据
持久化保存:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import shelve
sw = shelve. open ( 'shelve_test.pkl' ) # 创建shelve对象
name = [ '13' , '14' , '145' , 6 ] # 创建一个列表
dist_test = { "k1" : "v1" , "k2" : "v2" }
sw[ 'name' ] = name # 将列表持久化保存
sw[ 'dist_test' ] = dist_test
sw.close() # 关闭文件,必须要有
sr = shelve. open ( 'shelve_test.pkl' )
print (sr[ 'name' ]) # 读出列表
print (sr[ 'dist_test' ]) # 读出字典
sr.close()
|
说明:
1、其实shelve模块其实就是pickle模块的一个扩展,可以直接用key来读取持久化保存的数据,而不用原生pickle一样通过持久化的顺序来一个个读取出来
2、
sw[
'name'
]里的name其实就是key也就是自定义的一个名字,读取的时候通过这个key就可以方便读取出来
3、shelve_test.pkl并不是最终的文件名,shelve会自动生成如下三个后缀的文件
xml处理模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
我们先来,通过一张图认识一下xml文件的组成结构
说明:
最外层的标签我们称之为跟标签、也就是root,其他标签都是子标签,也就是child
1
2
3
4
5
6
7
8
|
import xml.etree.ElementTree as ET
tree = ET.parse( 'test.xml' ) # 读取xml文件,并以Element对象的形式保存
root = tree.getroot() # 获取根
for child in root: # 遍历root下的子标签
print (child.tag, child.attrib) # 打印标签名和属性
for i in child:
print (i.tag, i.text, i.attrib) # 打印标签名值和属性
|
输出结果:
country {'name': 'Liechtenstein'}
rank 2 {'updated': 'yes'}
year 2008 {}
gdppc 141100 {}
neighbor None {'direction': 'E', 'name': 'Austria'}
neighbor None {'direction': 'W', 'name': 'Switzerland'}
country {'name': 'Singapore'}
rank 5 {'updated': 'yes'}
year 2011 {}
gdppc 59900 {}
neighbor None {'direction': 'N', 'name': 'Malaysia'}
country {'name': 'Panama'}
rank 69 {'updated': 'yes'}
year 2011 {}
gdppc 13600 {}
neighbor None {'direction': 'W', 'name': 'Costa Rica'}
neighbor None {'direction': 'E', 'name': 'Colombia'}
我们也可以通过标签名来获取某一类标签的内容
1
2
|
for node in root. iter ( 'year' ): # 仅遍历标签名为year的标签
print (node.tag, node.text, node.attrib)
|
输出结果:
year 2008 {}
year 2011 {}
year 2011 {}
xml的常用操作
修改:
1
2
3
4
5
6
7
8
9
|
import xml.etree.ElementTree as ET
tree = ET.parse( 'test.xml' ) # 读取xml文件,并以Element对象的形式保存
root = tree.getroot() # 获取根
for node in root. iter ( 'year' ): # 遍历year标签
node.text = str ( int (node.text) + 1 ) # 将year标签的值+1,注意,读出来的标签的值都是字符串形式,注意数据类型转换
node. set ( 'updated' , 'yes' ) # 更新该标签
tree.write( 'test_2.xml' ) # 将结果写到文件,可以写到源文件也可以写到新的文件中
|
删除:
1
2
3
4
5
6
7
8
9
10
|
import xml.etree.ElementTree as ET
tree = ET.parse( 'test.xml' ) # 读取xml文件,并以Element对象的形式保存
root = tree.getroot() # 获取根
for country in root.findall( 'country' ): # 遍历所有country标签
rank = int (country.find( 'rank' ).text) # 在country标签查找名为rank的纸标签
if rank > 50 : # 判断如果rank标签的值大于50
root.remove(country) # 删除该标签
tree.write( 'test_3.xml' )
|
说明:
iter方法用于查找的最终标签,也就是下面没子标签的标签,获取他的值和属性的
findall方法用于查找还有子标签的子标签,然后和用fandall返回的对象的find方法获取找到的标签的子标签
创建自己的xml文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import xml.etree.ElementTree as ET
new_xml = ET.Element( "namelist" ) # 新建根节点,或者说xml对象
name = ET.SubElement(new_xml, "name" ,attrib = { "enrolled" : "yes" }) # 给新xml对象创建子标签
age = ET.SubElement(name, "age" ,attrib = { "checked" : "no" }) # name标签在创建子标签age,attrib变量为属性
sex = ET.SubElement(name, "sex" )
sex.text = '33' # 给标签赋值
name2 = ET.SubElement(new_xml, "name" ,attrib = { "enrolled" : "no" })
age = ET.SubElement(name2, "age" )
age.text = '19'
et = ET.ElementTree(new_xml) #生成文档对象
et.write( "test.xml" , encoding = "utf-8" ,xml_declaration = True ) # 将xml对象保存到文件xml_declaration表示xml文档的声明
ET.dump(new_xml) #打印生成的格式
|
ConfigParser模块
ConfigParser模块是用来处理配置文件的包,配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。常见很多服务的都是类似这种格式的,比如MySQL
假设我们有这样一个配置文件
[DEFAULT]name = www.qq.com[dbs]username = rootpassord = 123.comhost = 127.0.0.1 [server]name = www.baidu.comport = 80
读取配置文件
1
2
3
4
|
import configparser
config = configparser.ConfigParser() # 创建configparser对象
config.read( 'example.ini' ) # 读取配置件
print (config.sections()) # 获取所有的session
|
输出结果
['dbs', 'server']
注意:
可以看到这里没有输出DEFAULT,因为在Python中DEFAULT session有特殊用途,相当于所有session的默认值,也就是当DEFAULT中定义了一个key和value,此时session中这个不存在的时候,这个key的值就是DEFAULT定义的value
例如
1
|
print (config[ 'dbs' ][ 'name' ])
|
输出结果就是
www.qq.com
说明:
可以看到读取配置文件后的返回的对象有点类似于字典,可以通过key的方式将配置文件中的值一一取出来,甚至可以使用in关键字判断key是否存在
1
|
print ( 'server' in config)
|
输出结果
True
其他常用操作
读:
1
|
print (config.options( 'dbs' )) # 获取某个session下的所有option,也就是key
|
输出结果
['username', 'passord', 'host', 'name']
1
|
print (config.items( 'dbs' )) # 获取某个session的键值列表,类似字典的items方法
|
输出结果
[('name', 'www.qq.com'), ('username', 'root'), ('passord', '123.com'), ('host', '127.0.0.1')]
1
|
print (config.get( 'dbs' , 'host' )) # 获取某个session下的某个option的值
|
输出结果
127.0.0.1
1
2
3
|
port = config.getint( 'server' , 'port' ) # 获取某个session下的某个option的值,并以int的方式返回
print (port)
print ( type (port))
|
类似的方法还有getfloat和getboolean方法,当然前提是配置文件中的值就是对应的类型,否则会报错
说明:
配置文件中yes、True、1、true等为真,也就是通过getboolean返回的是True,no、False、0、false等为假,也就是返回的是False
删除:
1
2
|
config.remove_option( 'dbs' , 'host' ) # 删除option
config.remove_section( 'server' ) # 删除session
|
转载于:https://www.cnblogs.com/zhangxiaxuan/p/5222789.html
我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)相关推荐
- 我的Python成长之路---第六天---Python基础(18)---2016年2月20日(晴)
os模块 提供对操作系统进行调用的接口 >>> import os >>> os.getcwd() # 获取当前工作目录,类似linux的pwd命令 '/data/ ...
- 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)
一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公 ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9)的解决方法
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍
刚开始学习Python 并发查询或者并发读写时,看到大神们说,多线程是python的鸡肋,要学就学多进程.好吧,我连多线程怎么写都不知道呢. 因此,就写了以下的示例代码.代码目的是将test.txt文 ...
- 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用
课程起源 有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容.为了解决"更新内存中变量"的这个问题,查找了一些帖子,结 ...
- 【Python成长之路】python资料共享
[写在前面] 本来是想发python爬虫--双色球历史趋势及算法预测的博客,但是由于还有些地方值得改进,并且时间有点仓促,没有整理好知识点,因此只能周末再发了.刚好这几天好几个朋友和我说,也想学习或者 ...
- 【Python成长之路】python 基础篇 -- 装饰器【华为云分享】
[写在前面] 有时候看到大神们的代码,偶尔会用到@来装饰函数.当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强.使用场景是:日志级别设置.权限校验.性能测试等. ...
- 【Python成长之路】python 从零学爬虫 -- 没时间看《长安十二时辰》电视剧怎么办?直接爬取所有剧情吧!
[写在前面] 最近大火的<长安十二时辰>真的是好看,算的是良心网剧了.但是由于平时工作时间较长,经常无法准时追剧,并且又因为不想见到元裁那对挨千刀的(作为演员,演技是值得肯定的,角色演绎的 ...
最新文章
- 汇编 控制流伪指令 .break .continue .else .elseif .endif .endw .if .repeat .until .untilcxz .while
- HDU 1573: X问题
- photon四种同步方式_【Linux】多线程同步的四种方式
- java atlas mysql_使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置
- J2EE 重载跟覆盖的概念以及区别
- 用python写一个程序来验证每个数字的生成概率是否相同_Python实现简单生成验证码功能【基于random模块】...
- 今天是有纪念意义的一天--中国13亿人口日
- 最牛逼android上的图表库MpChart(二) 折线图
- 全网首发:LINUX编译JNA:编译产生libjnidispatch.so
- 独家可用发卡小程序源码下载卡密系统支持多种卡密领取模式流量主内附教程
- 图像检索代码python_python-图像检索
- 百词斩秋招java,成都百词斩2018web前端秋招笔试题
- 音乐计算机研修心得,音乐教师研修总结报告
- 网页设计HTML如何制作选项卡,jQuery制作网页版选项卡
- Java常用框架笔记(1)
- 基于springboot开发的停车场管理系统-计算机毕业设计
- 70个必备的数据分析工具
- 三更灯火五更鸡,正是男儿读书时
- 【树莓派】树莓派TXD、RXD的配置与使用可实现与STM32的通信
- 工业智能网关BL110详解之八十八: 实现西门子S7-1200 PLC接入华为云平台
热门文章
- en55032最新标准下载_大型设备塔吊安装维保、安全检查及案例,94页PPT下载!
- 【theano-windows】学习笔记二十——LSTM理论及实现
- softmax理论及代码解读——UFLDL
- 爬虫界又出神器|一款比selenium更高效的利器
- react-webpack config webpack@3.4.1
- 三元运算符运算(Day02)
- spring boot 整合 (全)
- livebos--iframe使用
- MySQL数据库视图(view),视图定义、创建视图、修改视图
- 基于Spring开发的DUBBO服务接口测试