第二十一章 configparser、subprocess 、xlrd、xml

时间:2022-12-15 20:15:31

1、confiparser

1. 什么是配置文件? 什么是配置信息?

  用于编写程序的配置信息的文件;为了提高程序的扩展性

2. 配置信息的数据要满足两个条件

  1.数据的值不是固定的

  2.可以有用户来指定

3. 配置文件的格式

  配置文件中只能出现两中数据类型:

  1.section 分区  [‘文件名’]

  2.option 选项  名称=值/  key = value   形式

  注:不能出现重复的分区名;同一个分区下不能有相同的选项名;只可以是任意类型,且字符串不需要加

    引号

4.

import configparser
#获取解析器对象
config=configparser.ConfigParser()
# 读取某个配置文件
config.read('a.cfg')

#查看所有的分区
res=config.sections() #['section1', 'section2']
print(res)

#查看标题section1下所有key=value的key
options=config.options('section1')
print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']

#查看标题section1下所有key=value的(key,value)格式
item_list=config.items('section1')
print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]

#查看标题section1下user的值=>字符串格式
val=config.get('section1','user')
print(val) #egon

#由于使用前需要进行转换,所以模块封装了转换类型的功能,只需要调用对应的函数即可,如下:
val1=config.getint('section1','age')
val2=config.getboolean('section1','is_admin')
val3=config.getfloat('section1','salary')

#是否存在某选项
print(cfg.has_option("mysql","name"))
#是否存在某分区
print(cfg.has_section("db"))

5.添加,删除,修改

 

import configparser

config=configparser.ConfigParser()
config.read('a.cfg',encoding='utf-8')

#删除整个标题section2
config.remove_section('section2')

#删除标题section1下的某个k1和k2
config.remove_option('section1','k1')
config.remove_option('section1','k2')

#判断是否存在某个标题
print(config.has_section('section1'))

#判断标题section1下是否有user
print(config.has_option('section1',''))


#添加一个标题
config.add_section('jack')

#在标题egon下添加name=egon,age=18的配置
config.set('jack','name','egon') # 如果已存则覆盖原来的值
#config.set('jack','age',18) #报错,必须是字符串

#最后将修改的内容写入文件,完成最终的修改
config.write(open('a.cfg','w'))

6.

import configparser

config = configparser.ConfigParser()
config.add_section("setion1")
config.set("setion1","name","zhangsn")

with open("test.config","w") as f:
config.write(f)

2、confiparser

子进程

什么是进程
指的是一个正在运行中的程序
子进程指的是由另个一进程开启的进程 a在运行过程中 开启了b b就是a的子进程

为什么要开启子进程
当一个程序在运行过程中有一个任务,自己做不了或是不想做 就可以开启另一个进程来帮助其完成任务
例如 qq中收到一个链接 点击链接 就开启了; 浏览器 浏览器就是qq的子进程


可以理解为用于执行系统指令的模块
 三个管道
p1 = subprocess.Popen("dirs",shell=True,stdout=subprocess.PIPE,stderr=-1)
print(p1.stdout.read())
print(p1.stderr.read().decode("GBK"))

案例:
tasklist | findstr python # 先执行tasklist 把结果交给 findstr 来处理

p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)

p2 = subprocess.Popen("findstr QQ",shell=True,stdin=p1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

print(p2.stdout.read())
print(p2.stderr.read())

3、xlrd

xlrd 模块是用于读取表格数据的 
xlrd 是一个第三方的需要自己安装 pip install xlrd

打开文件
wb
wb = xlrd.open_workbook("路径")
# 获取某个表格
sheet = wb.sheet_by_name()
sheet = wb.sheet_by_index()

# 获取行数
sheet.nrows()
# 获取列数
sheet.ncols()

# 取某行数据
sheet.row_values(行索引)

# 获取某单元格的数据
sheet.cell(行,列).value

2、xml  (全称:可扩展标记语言)

<tag></tag>  双标签

<tag/> 但标签 没有文本 一般用于文档结构   例如换行等

<tr/> 标识换行

<tag style="color:red" age="18">12345</tag>
一个标签的完整组成,有三个部分
tag 是标签名称
12345 是文本内容 text
name='jack'是标签的属性

标签的规范:
1.有开始就必须结束
2.所有属性值必须包含在双引号里面
3.只能有一个根标签(最外层只能有一个标签)
4.开始标签和结束标签的顺序是相反的,最先打开谁,就最后关闭谁,最后打开的最先关闭
文档声明可以不写,主要是告诉浏览器,该怎么解析这个文件,xml模块是自带的,不需要安装。
与json的区别
xml是一种可扩展的标记语言
可以高度自定义文档的结构,数据类型,标签的含义等等
扩展性比Json要强
json 更加适用于前后台数据交换,优点:轻量级 跨平台 语法简洁
xml更多用来作为配置文件 当然 python 不太长用,html就是一种xml
import xml.etree.ElementTree as ET
tree = ET.parse("test1.xml") 打开文档,得到一个元素树(xml)
root = tree.getroot() 获取根标签
for tag in root 遍历出 root 标签的所有子标签

for tag in root.iter 遍历出文档中所有的标签
country = root.find("country") 从root 下查找第一个名字为country 的子标签
for tag in root.iter("country") 从root下查找所有名字为country的子孙标签

 
解析xml得到一个tree对象后 查找标签的4种方式

1.iter()
如果没有参数则查找所有标签
如果有参数则查找所有名字匹配的标签
查找范围 为全文

2.find()
必须给参数
查找当前标签的子标签 返回第一个名字匹配的

3.findall()
必须给参数
查找当前标签的子标签 返回所有名字匹配的

4.直接遍历某个标签
返回的是这个标签的所有子标签