我的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

来自为知笔记(Wiz)

时间: 2024-08-27 22:14:47

我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)的相关文章

我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)

一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写. 实例变量:定义在方法中的变量,只作

我的Python成长之路---第八天---Python基础(24)---2016年3月5日(晴)

多线程编程 什么是多线程,线程是操作系统能够进行运算调度的最小单位.他包含在进程之中,是进程中的实际运作单位.线程是进程中一个单顺序的空值六,一个进程可以并发多个线程,每个线程可以并行处理不同的任务. threading模块 python的标准库提供了两个模块用于多线程处理,_thread和threading,_thread是低级模块,threading是高级模块,是对_thread进行了封装. 启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行: 线程有两种调

我的Python成长之路---第八天---Python基础(25)---2016年3月5日(晴)

多进程 multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/usr/bin/env python3 # coding:utf-8 ''' Created on: 2016年3月5日 @author: 张晓宇 Email: [email protected] Versi

我的Python成长之路---第八天---Python基础(23)---2016年3月5日(晴)

socketserver 之前讲道德socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的socket演示程序的服务端就可以了,客户端不用变 1

单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例

本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,sdcc的编译环境搭建参照:单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境,废话不多,进入主题: main.c(主函数) 1 #include "8051.h" 2 #include "delay.h" 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar t

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算是有一点基础.但在这里我要保持空杯心态,一切从头开始.好了不多说,Let's Python!!!! 一.Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.目前Python已经成为实际上除了中国最流行的开发语

python成长之路第三篇(2)_正则表达式

打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表达式相信很多人都熟悉了,在python中正则表达式的支持是通过re(regular expression)模块,正则表达式是可以匹配文本片段的模式,简单的是正则表达式就是普通的字符串,可以处理字符串.也就是说正则表达式的存在就是来处理文本字符串的 下面来熟悉下正则中的几个概念: 1.通配符 通配符是

Python成长之路_装饰器

一.初入装饰器 1.首先呢我们有这么一段代码,这段代码假如是N个业务部门的函数 1 def f1(aaa): 2 print('我是F1业务') 3 if aaa == 'f1': 4 return 'ok' 5 6 def f2(aaa): 7 print('我是F2业务') 8 if aaa == 'f2': 9 return 'ok' 业务代码 这里呢也就是当我们调用上面的函数的时候,传入值给aaa,当aaa的值等于f1或者f2就返回ok 2.公司有N个业务部门,1个基础平台部门,基础平台