模块5
Confiparser模块:
confiparser翻译为配置解析,很显然,他是用来解析配置文件的。
什么是配置文件:就是用于编写程序的配置信息的文件
什么是配置信息:为了提高程序的扩展性,我们会把一些程序中需要用到的值交给用户来确定,
比如迅雷的下载目录,同时下载数,qq的提示音等等
作为配置信息的数据,应该满足两个条件:
1.数据的值不是固定的
2.可以由用户来指定
例如我们做一个登录功能,为了方便使用我们可以将用户的用户名密码写到配置文件中,可以不需要每次都输入
配置文件编写格式:
在使用该模块前必须要先找到其配置文件的格式,由于读写文件的代码是模块封装好的,所以必须按照固定的方式来编写,才能被正常解析,当然并不是只有python有配置文件,其他任何语言都有,但是格式是相同的!
格式:
配置文件中只允许出现两种类型的数据
第一种 section 分区 方括号中是分区的名称 例如[ATM]
第二种 option 选项 名称 = 值
注意:
不能出现重复的分区名
同一个分区下不能有相同的选项名
值可以是任何类型, 且字符串不需要加引号
confiparser 的使用:
读取数据
import confiparser
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)
#由于使用前需要进行转换,所以模块封装了转换类型的功能,只需要调用对应的函数即可。
如下:
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'))
添加,删除,修改
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'))
代码创建生成文件
import configparser
config = configparser.ConfigParser()
config.add_section("setion1")
config.set("setion1","name","zhangsn")
with open("test.config","w") as f:
config.write(f)
总结:
configparser模块用于解析配置文件,虽然可以修改和创建配置文件,但是并不常用,解析才是其核心功能!
subprocess模块
subprocess 称之为子进程,进程是一个正在运行的程序
为什么要使用子进程,因为之前的os.system()函数无法获取命令的执行结果,另一个问题是当我们启动了某一其他进程时无法与这个子进程进行通讯。
当要在python程序中执行系统指令时,将应该使用subprocess 自动化运维经常会使用
#测试
res = os.system("python")
print(res)
# res结果为执行状态
subprocess的使用
import subprocess
p = subprocess.Popen("ls",shell=True)
#shell=True 告诉系统这是一个系统指令 而不是某个文件名
#此时效果与sys.system()没有任何区别,都是将结果输出到控制台
# 那如何与这个进程交互数据呢,这需要用到三个参数
1.stdin 表示输入交给子进程的数据
2.stdout 表示子进程返回的数据
3.stderr 表示子进程发送的错误信息
#这三个参数,的类型都是管道,(管道本质就是一个文件,可以进行读写操作),使用subprocess.PIPE来获取一个管道
一个子进程执行tasklist命令获取所有的任务信息,然后将结果交给另一个进程进行查找
另一个子进程执行findstr 查找某个任务信息
p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)
p2 = subprocess.Popen("findstr smss",shell=True,stdin=p1.stdout,stdout=subprocess.PIPE)
print(p2.stdout.read())
总结: subprocess 主要用于执行系统命令,对比sys.system 区别在于可以在进程间交换数据
xlrd模块
是python中一个第三方的用于读取excle表格的模块
exlce结构分析
一个excle表格包含多个sheet
一个sheet 中包含多行多列
每个单元格具备唯一的行号和列号
常用函数
import xlrd
读取文件
work_book = xlrd.open_workbook("/Users/jerry/Desktop/公司机密数据.xlsx")
选取一个表
获取所有所有表格名称
print(work_book.sheet_names())
第2个 索引从0开始
sheet = work_book.sheet_by_index(1)
表格名称
print(sheet.name)
行数
print(sheet.nrows)
列数
print(sheet.ncols)
批量读取行数据
取出第6行的全部内容包含数据类型
print(sheet.row(6))
取出第6行的内容包含数据类型 从第3列开始获取
print(sheet.row_slice(6,start_colx=3))
取出第6行的内容包含数据类型 从第3列开始获取
print(sheet.row_slice(6,start_colx=4,end_colx=5))
获取该行所有数据类型 一数字表示
print(sheet.row_types(6))
print(sheet.row_values(6))
单元格的处理
print(sheet.cell(0,0).value) # 取值
print(sheet.cell(0,0).ctype) # 取类型
print(sheet.cell_value(2,0)) # 直接取值
print(sheet.row(0)[0]) # 先取行再取单元格
print(sheet.col(0)) # 第0列所有数据
print(sheet.col(0)) # 先取列再取单元格
print(sheet.cell_type(0,0))
单元格位置转换
print(xlrd.cellname(2,1))
print(xlrd.cellnameabs(0,2))
print(xlrd.colname(5))
时间类型转换
print(sheet.cell(6,5).value)
print(xlrd.xldate_as_datetime(sheet.cell(6,5).value,1))
xlwt模块
是python中一个第三方的用于写入excle数据到表格的模块
import xlwt
创建工作簿
work = xlwt.Workbook()
创建一个表
sheet = work.add_sheet("员工信息数据")
创建一个字体对象
font = xlwt.Font()
font.name = "Times New Roman" # 字体名称
font.bold = True # 加粗
font.italic = True # 斜体
font.underline = True # 下划线
创建一个样式对象
style = xlwt.XFStyle()
style.font = font
写入标题
for k in keys:
sheet.write(0,keys.index(k),k,style)
写入数据
for i in infos:
for k in keys:
sheet.write(1 + infos.index(i),keys.index(k),label = i[k])
保存至文件
work.save("test.xls")