day22 subprocess、configeparser、表格操作模块

时间:2022-02-19 02:52:36
今日内容:
1、configparser模块的使用
2、subprocess模块的使用
3、表格处理模块
xlrd模块
xlwt模块
1、configparser模块
configparser模块是用来解析配置文件的

配置文件就是用来设置程序的
因为有些程序的的某些设置是不能写死的,例如密码登录次数超过某个值时进行锁死,此时的规定的登录次数不能写死
所以此时如果想要对锁死的次数进行设置就要将次数写到配置文件中,如果想要修改规定次数,只要修改配置文件中的值就可以,不用修改源代码

配置文件的格式:
想要用configparser模块解析配置文件,那么配置文件的格式应该有一定的规定
配置文件的格式为:
[sections] # 分区,在配置文件中必须唯一
key = value # option选项,所有的信息全部为字符串
configparser模块的用法:
        
        # read()方法
        # 将文件使用模块读取,将读取的内容存入解析器对象中
        
        # 1. 创建解析对象
        c = configparser.ConfigParser()
        # 2. 读取指定的配置文件
        c.read("atm.cfg",encoding="utf-8")
        # 3. 获取一个配置项
        count = int(c.get("atm","err_count"))  # count = 3
        
        temp_count = 0
        while True:
            if temp_count >= count:
                print("该账户以及被锁定!")
                break
            name = input("useranme:")
            pwd = input("password:")
            if name == "wangyong" and pwd == "123":
                print("登录成功!")
                break
            else:
                print("用户名或密码不正确!")
                temp_count += 1
                
                
        # configparser其他用法
        c = configparser.ConfigParser()
        c.read("atm.cfg",encoding="utf-8")
        # 1. 获取所有分区名称
        print(c.sections())  # 列表格式
        # 2. 获取莫格分区下所有的option名字
        print(c.options("atm"))  # 列表格式
        
        # 3. 封装了类型转换的方法 getint,getfloat,getboolean
        print(type(c.get("mysql","pwd")))     # <class 'str'>
        print(type(c.getint("mysql","pwd")))  # <class 'int'>
        
        # 4. 设置某个选项的值,如果option已经存在则覆盖
        c.set("atm","err_count","123")
        
        # 5. 添加一个新分区
        c.add_section("atm2")
        c.set("atm2","test","123")
        
        # 将修改后的配置文件重新写入到配置文件中,写入的对象为 文件 
        with open("atm.cfg","wt",encoding="utf-8") as f:
            c.write(f)
        
        # 6. 获取所有的section
        print(list(c.keys()))   # ['DEFAULT', 'mysql', 'mysqld', 'atm', 'atm1', 'atm2']
        
        # 7. 获取第二个section的名字
        print(list(c.values())[2].name)   # mysqld
        
        # 8. 查看某个对象所有的可能属性
        print(dir(list(c.values())[1]))
2、subprocess模块
subprocess模块:
是一个开启子进程的模块主要用于处理在命令行中执行的命令,子进程就是由进程开启的进程。

为什么要开启子进程:
当一个程序在运行进程中有一个任务自己做不了或者不想做,就可以开启另一个程序来协助完成任务内存中
而每一个进程的内存区域又是相互隔离的不能互相访问,
所以需要管道来进行通讯

subprocess的方法:
subprocess.Popen("命令",shell=True,stdin=subprocess.PIPE,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
其中:stdin、stderr、stdout是三个管道,用于存放返回的命令的执行结果,正确结果存放在stdout中,错误信息存放于stderr中,
传入时使用stdin中。
# 案例
        # tasklist | findstr python  # 先执行tasklist把结果交给findstr来处理
        p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)   # shell = True 是一个指令,否则为一个文件
        p2 = subprocess.Popen("findstr QQ",shell=True,stdin=p1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        
        print(p2.stdout.read())  # b'QQProtect.exe   7120 Services      0     10,216 K\r\nQQ.exe      7184 Console
        print(p2.stderr.read())    # b''
3、表格处理模块
3.1 xlrd(较为重要):表格读取
xlrd使用来读取表格中数据的模块
用法:
    打开文件
    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 xlrd

    # 1. 打开文件
    workbook = xlrd.open_workbook("123.xlsx")
    
    # 2. 查看所有工作表的名称
    print(workbook.sheet_names())    # ['Sheet1', 'Sheet2', 'Sheet3']
    
    # 3. 获取某个工作表
    # sheet = workbook.sheet_by_index(1) # 获取第二个表格,索引从0开始
    sheet = workbook.sheet_by_name("Sheet1")  # 获取名字为Sheet1的表格
    
    # 获取某一行
    row = sheet.row(2)  # 获取第二行
    
    # 获取单元格
    cell = row[1]
    
    # 单元格的数据类型
    print(cell.ctype)   # 2
    
    # 单元格的数据
    print(cell.value)   # 16.0
    
    # 获取表格行数列数
    print(sheet.ncols)    #
    print(sheet.nrows)    #
    
    # 获取第一行的单元格个数
    print(sheet.row_len(1))
    
    
    
    # 案例 将每个数据提取为python类型
    li = []
    # 先拿出所有的名称
    keys = sheet.row_values(1)
    for i in range(2,sheet.nrows):
        print(i)
        # 直接取出所有值
        row = sheet.row_values(i)
        dic = {}
        for k in keys:
            # 每次拿出一个key与一个value一一对应
            dic[k] = row[keys.index(k)]
        li.append(dic)
    print(li)   # [{'name': 'asd', 'age': 16.0}, {'name': 'qwe', 'age': 18.0}]
3.2 xlwt:表格写入
import xlwt

    # 创建一个工作簿
    wb = xlwt.Workbook()
    
    # 创建一个工作表
    sheet = wb.add_sheet("456") # type:xlwt.Worksheet
    
    # 写入数据
    sheet.write_merge(0,0,0,4,"这是标题")
    
    # 将工作簿写入到文件
    wb.save("abc.xlsx")
    复制代码
    复制代码
    # 案例
    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_inder = 2 + data.index(dic)
        for v in values:
            sheet.write(row_inder,values.index(v),v)
    
    # 保存文件
    wb.save("机密数据")