今日内容:
1.configparser模块
2.subprocess模块
3.xlrd(读),xlwt(写) 表格处理
configparser模块
import configparser
# configparser 文件的格式
# 后缀为.cfg 内部有section (分区) 与 option(选项)选项也就是数据
# section使用[]包裹,option 是一个类似python中的字典,key 和 value的存在 比如 a = 1,a就是key,value就是1
# 一个文件中不能有同名的section,
# 所有的option必须都必须包含在section中
# 同一个section(分区)内不能出现重名的option(选项)
# cfg文件中没有数据类型的区分,都是以字符串的形式存在,
# 可以使用注释
#
# 创建解析对象
c = configparser.ConfigParser()
c.read('test.cfg', encoding='utf-8') # 读取指定的配置文件,第一位传文件路径,第二位为读取编码
# 获取一个配置项
count = int(c.get('atm', 'err_count')) # 刚才已经使用c获取了文件,现在使用get方法获取文件中的值,第一个传section(分区),第二个传option(选项)
print(int(count)) # 打印结果为err_count它的值,3
# # 获取值后就可以使用了
#
# # 案例
temp_count = 0
while True:
if temp_count >= count: # 取出的数据做比较,如果输入次数超次用户就会被冻结
print('该用户已被冻结')
break
name = input('用户名')
pwd = input('密码:')
if name == 'qwe' and pwd == '123':
print('登陆成功')
break
else:
print('用户名或密码不正确')
temp_count += 1
c = configparser.ConfigParser()
c.read('test.cfg', encoding='utf-8')
# 获取文件下的所有分区
print(c.sections()) # 直接.出来 c.sections
# 获取某个分区下的所有选项名字
print(c.options('abc')) # 必须传入分区名字
# 类型转换方法,因为存放的都是字符串类型,数字类型的必须转换才能使用
c.getint()
c.getfloat()
c.getboolean()
# 更改某个选项的值
c.set('def', 'b', '888')
# 添加新分区
c.add_section('atm1')
# 在新分区内添加新选项和值
c.set('atm1', 'd', '888')
# 然后使用write 写入文件
with open('test.cfg', 'wt', encoding='utf-8')as f:
c.write(f)
# 查看所有分区,文件中有一个默认分区,DEFAULT
print(list(c.keys()))
#
print(list(c.values()))
# dir 可以查看某个对象所有可用的属性,__开头的是系统自带的
print(dir(list(c.values())[1])) # ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
# 案例,在文件中添加section 与 option
import configparser
c = configparser.ConfigParser()
c.read('test.cfg',encoding='utf-8')
c.add_section('test5')
c.set('test5','name','jack')
with open('test.cfg','wt',encoding='utf-8') as f:
c.write(f)
# 查看文件中有没有section,与option
c.has_section() # 传入 section
c.has_option() # 传入 section 与 option
subprocess模块
'''
subprocess子进程
什么是进程:指一个正在运行中的程序
什么是子进程:子进程指的是由另一进程(对应称之为父类)所创建的的进程
为什么要开启进程:当一个程序在运行中有一个任务,自己做不了或者不想做,就可以开启一个进程来帮助其完成任务
例如,QQ中收到一个链接,点击链接就开启了浏览器,浏览器就是QQ的子进程
可以链接为用于执行系统指令的模块
'''
import subprocess
# 模块作用:可以调用shell命令(系统命令) 也可以调用程序
import os
# os.system 可以使用系统命令
#
# 内存中,每个进程的内存区域是相互隔离的不能直接访问 所以需要管道来通讯
# stdout = subprocess.PIPE # 就是指定了一个输出管道
# # 此处使用系统指令dir
p = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) # 指定一个管道,第一位放指令或执行程序的绝对路径
# 输入shell=True,是告诉subprocess模块这是一个指令,内部可以传入标准三流,输入(stdin),输出(stdout),错误(stderr)
# # 从管道中读取出执行结果,因为windows是使用GBK编码所以需要对执行结果进行编码
reuslt = p.stdout.read().decode('GBK') # 从管道中取出结果
# print(reuslt) 执行结果,与在windows的cmd命令中执行dir一样
# 三个管道. (标准三流,输入管道,输出管道,错误信息管道)
p1 = subprocess.Popen('dirs', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(p1.stdout.read())
print(p1.stdout.read().decode('GBK'))
# 案例:
# 比如 需要把 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(p1.stdout.read().decode('GBK'))
print(p2.stdout.read().decode('GBK'))
#
# subprocess需要掌握的一些方法
# 参数1 指令
# 参数 2 是否是一个指令
# 参数 3 输入管道
# 参数 4 输出管道
# 错误输出管道
p = subprocess.Popen('指令或者某个exe',shell = True,stdin=,stdout=,stderr= )
# 取出管道中的数据
p.stderr.read()
p.stdout.read()
p.stdin.read()
# 将输入写入管道,交给对方进程
p.stdin.write(p.stdout.read())
# 当你需要执行系统指令时,需要知道以上的功能方法
表格处理
读取数据:
import xlrd
workbook = xlrd.open_workbook("机密数据.xlsx")
#查看所有工作表的名称
print(workbook.sheet_names())
# 获取某个工作表
# sheet = workbook.sheet_by_index(1)
sheet = workbook.sheet_by_name("Sheet1")
# print(sheet.name)
#
# # 获取某一行
row = sheet.row(2)
# print(row)
#
#
# # 获取单元格
cell = row[4]
# print(cell.ctype) # 单元格的数据类型
# print(cell.value)# 单元格的数据
#
# # 转换日期类型
print(str(xlrd.xldate_as_datetime(cell.value,0)))
# 获取表格的列数
# print(sheet.ncols)
# # 获取表格的行数
# print(sheet.nrows)
# 获取第一行的单元格个数
# print(sheet.row_len(1))
# 某个单元格数据
print(sheet.cell(0,0))
# 将数据读取出来变成python的数据类型 [{},{},{}]
# 案例 将边个数据提取为python数据类型
# 最后的列表
li = []
# 先拿出所有的列名称
keys = sheet.row_values(1)
for i in range(2,sheet.nrows):
print(i)
# row = sheet.row(i)
# 直接取出所有值
row = sheet.row_values(i)
# 创建一个空字典
dic = {}
for k in keys:
# 每次拿出一个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)
"""
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
"""
生成表格:
import xlwt
"""
xlwt 是第三方的用于生成一个Exel表格
"""
# 创建一个工作薄
wb = xlwt.Workbook()
# 创建一个工作表
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")
xlwt练习:
# 将数据写入到表格中
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'}]
# # 先创建一个excel程序
wb = xlwt.Workbook()
# 再创建一个工作表,文件名叫'信息'
sheet = wb.add_sheet('信息')
# 写入标题,合并第0行的4列,并把标题写入
sheet.write_merge(0, 0, 0, 4, '员工信息')
# 写入列名称
keys = data[0].keys() # 此处使用data[0].keys 是把data[0]号位(也就是第一个字典)的所有key取出,这里其实是excel中的概括信息那一列,取出来做概括信息
i = 0 # 设置列在文件中的其实位置,0列,从0列开始写
for k in keys: # 循环获取它的每个key
sheet.write(1, i, k) # 此处写入文件中,(1(因为第0行是标题,所以从第1行开始写,i(是列,设置从i 列开始写入,k 是data[0]的所有key)))
i += 1
# 写入数据
for dic in data:
values = list(dic.values()) # 此处是把data中的字典的value取过来,用list装起来 ['哈利波特', 1.0, 'man', 18.0, '2001-01-01 00:00:00']
row_index = 2 + data.index(dic) # 设置写入的数据的位置
for v in values:
sheet.write(row_index,values.index(v),v)
# 参数(起始行,数据,)
wb.save('员工信息副本.xls') # 写入到硬盘