欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

day21(configparser ,subprocess , xlrd ,xlwt 模块)

程序员文章站 2022-04-15 15:56:43
一,configparser模块 二,subprocess模块 三,xlrd模块 四,xlwt模块 ......

一,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('路径')
    
'''