zoukankan      html  css  js  c++  java
  • configparser模块 subprocess 模块,xlrd 模块(表格处理)

     今日内容:

    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') # 写入到硬盘


  • 相关阅读:
    【Python】多态、协议和鸭子类型
    【Python】魔法方法之__call__,将对象当方法使用
    【Python】策略模式
    【Python】if 后怎么就可以跟对象?变量交换写法是语法糖吗?
    【Python 库】NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
    【Python 库】NumPy 超详细教程(2):数据类型
    【Python 库】NumPy 超详细教程(1):NumPy 数组
    【杂谈】10 年三线小城 IT 开发的感悟
    【PostgreSQL】安装及中文显示
    【Python 库】轻量级 ORM 框架 peewee 用法详解之——增删改查
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10865031.html
Copyright © 2011-2022 走看看