一,configparser模块
'''
configparser模块:
是什么:
用于解析配置文件的模块
配置文件的定义:
用于编写保存某个软件或某个系统的一系列参数的文件
设置参数
为什么需要配置文件:
无论是什么样的软件应用程序,在执行过程中,都需要很多的参数
而一些参数经常会需要修改
例如:qq里面的下载路径 ATM中的错误次数
如果直接写死在程序中,使用者在需要修改参数时,就不得不直接修改源代码
这是非常不合理的,所以我们通常还会把这些需要变化的参数提取出来放到配置文件中
'''''
#打开配置文件来读取参数
# with open('atm.cfg','r')as f:
# err_count = int(f.read())
# print(err_count,type(err_count))
import configparser
#创建解析对象
c = configparser.ConfigParser()
c.read('atm.cfg',encoding='utf-8') #读取指定的配置文件
#获取一个配置项
count = int(c.get('atm','err_count'))
print(int(count))
print(type(count))
temp_count = 0
while True:
if temp_count >= count:
print('该账号已经被锁定')
break
name = input('name:')
pwd = input('pwd:')
if name == 'owen' and pwd == '123':
print('登录成功')
break
else:
print('账号或密码不正确!')
temp_count += 1
import configparser
# 创建解析对象
c = configparser.ConfigParser()
c.read('atm.cfg',encoding='utf-8')
#获取所有分区名称
print(c.sections()) #['atm', 'mysql', 'mysqlId']
#某个分区下所有option名字
print(c.options('mysql')) #['name', 'pwd']
#判断某个分区是否存在
print(c.has_section('mysql')) #True
#判断某个选项是否存在
print(c.has_option('mysql','name')) #True
# 封装了类型转换的方法
count = c.getint('atm','err_count')
# c.getboolean()
# c.getfloat()
print(count,type(count)) #3 <class 'int'>
#设置某个选项的值,如果option已经存在则覆盖
c.set('atm','test','666')
#添加一个新分区,如果分区存在会报错
c.add_section('atm')
print(list(c.keys())) #['DEFAULT', 'atm', 'mysql', 'mysqlId']
print(list(c.values())[1].name) #atm
#通过get获取里面的值
print(c.get('atm','test'))
print(c.getint('atm','err_count'))
print(list(c.values())) #[<Section: DEFAULT>, <Section: atm>, <Section: mysql>, <Section: mysqlId>]
#dir 可以查看某个对象所有可用的属性 __开头不要管,系统自带的
print(dir(list(c.values())[1]))
#写入数据到文件
with open('atm.cfg','wt',encoding='utf-8')as w:
c.write(w)
# 创建 解析对象,读取指定的配置文件
c = configparser.ConfigParser()
c.read('atm.cfg',encoding='utf-8')
# 设置某个选项的值 如果option以及存在则覆盖
c.set('atm1','aaa','111')
#添加
c.add_section('ATM_TEST')
c.set('ATM_TEST','WWW','HTTPS')
#写入数据到文件
with open('atm.cfg','wt',encoding='utf-8')as w:
c.write(w)
#代码生成配置文件
import configparser
c = configparser.ConfigParser()
c.add_section('test')
c.set('test','name','jock')
with open('test.cfg','wt',encoding='utf-8')as w:
c.write(w)
'''
总结:
configparser:用来解析配置文件的
一:对配置文件有格式要求:
1,只能由分区section和选区option
2,不能有重复的section,同一个section,不能有重复的option
3,不区分数据类型,都是字符串
4,任何option都必须包含在section中
二:需要掌握的方法:
read('文件路径','编码')
get('分区名称','选项名称') 返回的是字符串
getint getfloat getboolean
'''
二,subprocess模块
'''
subprocess:子进程
1,什么是进程:
指的是一个正在运行中的程序
子进程指的是由另一个进程开启的进程,a在运行过程中开启了b ,b就是a的子进程
2,为什么要开启子进程:
当一个程序在运行过程中有一个任务,自己做不了或是不想做,就可以开启另一个进程来帮助其完成任务
例如:QQ中收到一个链接,点击链接,就开启了浏览器,浏览器就是QQ的子进程
可以理解为用于执行系统指令的模块
'''''
import subprocess
import os
# os.system('dir') #系统指令
'''
内存中,每个进程的内存区域是相互隔离的不能直接访问,所以需要管道来通讯
stdout = subprocess.PIPE就是指定了一个输出管道
p = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) 从管道中读取出执行结果
result = p.stdout.read().decode('GBK')还需要设定编码格式
'''
#三个管道
p1 = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=-1)
# winds 默认是GBK,所以需要指定编码格式
print(p1.stdout.read().decode('GBK'))
p2 = subprocess.Popen('disr',shell=True,stdout=subprocess.PIPE,stderr=-1)
#打印错误信息
print(p1.stderr.read().decode('GBK'))
#案例:
# tasklist | findstr python #先执行tasklist 把结果交给 findstr来处理
p1 = subprocess.Popen('tasklist',shell=True,stdout=subprocess.PIPE)
p2 =subprocess.Popen('findstr python',shell=True,stdin=p1.stdout,stdout=subprocess.PIPE
,stderr=subprocess.PIPE)
#打印进程信息
print(p2.stdout.read().decode('GBK'))
print(p2.stderr.read().decode('GBK'))
'''
后期项目:CMDB,需要收集服务器的信息,比如内存信息
总结:
subprocess 需要掌握的方法:
1,参数 指令
2,是否是一个指令
3,错误输出管道
4,输入管道
5,输出管道
p = subprocess.Popen('你的指令或是某个exe',shell=True,stdout=,stdin=,stderr=)
取出管道中的数据
p.stdout.read().encode()
p.stderr.read()
将输入数据写入管道,交给对方进程
p.stdin.write(p.stdout.read())
当你需要执行系统命令时,你需要想到它
'''
三,xlrd模块
import xlrd
workbook = xlrd.open_workbook('机密数据.xlsx')
#查看所有工作表的名称
print(workbook.sheet_names()) #['Sheet1', 'Sheet2', 'Sheet3']
#获取某个工作表
sheet = workbook.sheet_by_index(1)
print(sheet.name) #Sheet2
sheet = workbook.sheet_by_name('Sheet1')
print(sheet.name) #Sheet1
#获取某一行
row = sheet.row(2)
print(row) #[text:'张三', number:23.0, text:'男', number:180.0, empty:'']
#获取单元格
cell = row[0]
#单元格的数据类型
print(cell.ctype) #1
#单元格的数据
print(cell.value) #张三
#转换日期类型
print(str(xlrd.xldate_as_datetime(cell.value,0)))
#获取表格的列数
print(sheet.ncols) #5
#获取表格的行数
print(sheet.nrows) #6
#获取第一行的单元格的个数
print(sheet.row_len(1)) #5
#某个单元格的数据,索引从0开始
print(sheet.cell(0,0)) #text:'机密数据表'
print(sheet.cell(3,0)) #text:'李四'
#将数据读取出来变成python的数据类型 [{},{},{}]
#案例:将每个数据读取为python数据类型
#最后的列表
li = []
#先拿出所有的列名称
keys = sheet.row_values(1)
print(keys) #['姓名', '年龄', '性别', '成绩', '时间']
for i in range(2,sheet.nrows):
print(i)
row = sheet.row(i)
print(row) #[text:'张三', number:23.0, text:'男', number:180.0, text:' 2010/01/01']
#直接取出所有值
row = sheet.row_values(i)
print(row) #['张三', 23.0, '男', 180.0, ' 2010/01/01']
#创建一个空字典
dic = {}
for k in keys:
print(k)
#每次拿出一个key 与一个value --对应
dic[k] = row[keys.index(k)]
if k == '生日':
#如果是生日字段,需要转换时间类型
dic[k] = str(xlrd.xldate_as_datetime(row[keys.index(k)],0))
li.append(dic)
print(li) #[{'姓名': '张三', '年龄': 23.0, '性别': '男', '成绩': 180.0, '生日': '2001-01-02 00:00:00'},{.....]
'''
总结:
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_value(行索引)
获取某单元格的数据
sheet.cell(行,列).value
'''
四,xlwt模块
import xlwt
#xlwt 是第三方用于生成一个Exel表格
#1,创建一个工作簿
wb = xlwt.Workbook()
#2,创建一个工作表
sheet = wb.add_sheet('特工信息') #type:xlwt.Worksheet
#字体对象
font = xlwt.Font()
font.bold = True
#style样式对象
style = xlwt.XFStyle()
style.font = font #将字体设置到样式中
#写入数据
# sheet.write(0,0,'这是标题')
#写入并合并单元格
sheet.write_merge(0,0,0,4,'这是标题',style)
#将工作簿写入到文件
wb.save('abc.xls')
#将数据写入到表格中
import xlwt
data = [{'name': '哈利波特', '代号': 1.0, 'gender': 'man', 'age': 18.0,'生日': '2001-01-01 00:00:00'},
{'name': 'owen', '代号': 748.0, 'gender': 'woman', 'age': 68.0, '生日': '1950-01-01 00:00:00'},
{'name': 'jerry', '代号': 168.0, 'gender': 'man', 'age': 18.0,'生日': '2001-01-01 00:00:00'}]
#创建工作簿
wb = xlwt.Workbook()
#创建工作表
sheet = wb.add_sheet('特工信息')
#写入标题
sheet.write_merge(0,0,0,4,'特工信息表')
#写入列名称
keys = data[0].keys()
i = 0
for k in keys:
sheet.write(1,i,k)
i += 1
#写入数据
for dic in data:
values = list(dic.values())
row_index = 2 + data.index(dic)
for v in values:
sheet.write(row_index,values.index(v),v)
#保存文件
wb.save('机密数据副本.xls')
'''
xlwt 用于将数据写入到表格中
使用到的几个函数:
1,创建工作簿
wb = xlwt.Workbook()
2,创建工作表
sheet = wb.add_sheet('sheet名字')
3,写入数据
sheet.write(行,列,数据)
4,保存到文件
wb.save('路径')
'''