zoukankan      html  css  js  c++  java
  • python学习 day19 configparser模块 os模块 subprocess模块

    上周五回顾

    logging
        用于记录日志
        四种核心角色:
            生成器Logger
            过滤器Filter
            处理器Handler
            格式化处理器 Formatter
        logging.info.debug 使用默认配置
        
        配置方式:
        1.basicConfig
        2.自己创建四种角色 并进行关联
        3.用配置文件,字典来配置  logging.config
        配置完后
        用logging.config.dictConfig(loggin_config.LOGGING_DIC)
        aaloger = loger.GetLogger('aa') #找得到配置就配置,找不到就用默认配置
        
    shelve
        open 打开文件 类似字典
        用于序列化,序列化的中间格式,不能跨平台
    
    sys
        跟解释器的相关的操作
        argv 获取调用解释器时传递的参数
        path 添加环境变量

    本周安排 day1 常用模块

    1. os ***** 表示操作系统

    该模块主要处理与操作系统相关的操作
    最常用的是:文件操作
    打开 读取 写入 删除 复制 重命名
    
    os.getcwd() 获取当前执行文件所在的文件夹路径
    os.chdir()  修改当前的工作目录,相当于命令行的cd
    # 获取当前文件夹的字符串表现方式:.
    os.curdir 
    # 获取父文件夹的字符串表现方式:..
    os.pardir
    
    os.makerdirs('a/b/c') # 可以创建多级目录,如果不存在,可以创建中间的目录
    
    os.mkdir('c/b/a') # 只能创建单级目录,会把c和b当成已存在的路径
    
    os.redir('a') # 删除文件夹必须保证文件夹是空的,才能删除
    
    #如果要删除一个文件夹,而且文件夹不为空,思路是先遍历这个文件夹中的所有文件和文件夹
    
    #要删除的文件路径
    path=r'....acd.txt'
    先把里面的文件全部删除,然后删除文件夹
    for f in os.listdir('c'):
        f_path = path+'\'+f
        os.remove(f)
    os.remove('c')
        
    #注意遍历删除文件时,listdir得到的是文件名称,需要手动拼接完整路径
    遍历删除文件夹内所有文件和文件夹
    import os
    def dele1(s):
    if os.path.isdir(s):
        for dir in os.listdir(s):
            tmp_dir = os.path.join(s, dir)
            print(tmp_dir)
            if os.listdir(s) != []:
                dele1(tmp_dir)
                if os.path.isfile(tmp_dir):
                    os.remove(tmp_dir)
                if os.listdir(s) == []:
                    os.rmdir(s)
    dele1(r'/Users/authurchen/脱产5期内容/day19/代码/os模块/a')
    
    
    print(os.stat(文件名)) # 获取文件信息
    
    os.sep # 获取当前系统的路径分隔符,windows:\,linux:/,当你的程序要跨平台时,路径分隔符不能直接写死,要从os中获取
    
    os.linesep # 返回当前平台的换行符
    
    # 执行系统命令
    os.system('dir')
    
    os.environ # 获取系统的环境变量,跟解释器的sys.path不一样
    
    # 什么时候使用os:当需要操作文件及文件夹的时候
    # 重点放在文件的增删改查

    2. os.path *****

    path 该模块用于处理路径
    之所以有这个模块,是因为python是跨平台的,各平台的路径书写方式不同,所有将所有与路径相关的都进行了封装
    使用了path后,你的程序就是跨平台的,不会因为路径产生错误
    
    os.path.abspath('__file__') # 把当前执行文件所在文件夹和后面文件做了拼接
    
    os.path.split('绝对路径') # 将路径分隔为文件夹和文件名
    
    os.path.basename('路径') # 获取路径中的文件名称
    os.payh.dirname('路径') # 获取路径中的文件夹路径
    
    os.path.exists('路径') # 判断一个文件路径是否存在,返回布尔值
    
    os.path.isabs('路径') # 判断是否是绝对路径,依据是第一个字符是不是路径分隔符,是则表示绝对路径
    
    os.path.isfile('路径') # 判断路径是否是一个文件,返回布尔值
    os.path.isdir('路径') # 判断路径是否一个是文件夹,返回布尔值
    #不是一个文件,必然是一个文件夹
    
    os.path.join('路径1','路径2') # 以当前平台的路径分隔符来拼接路径
    如果有多个开始的盘符",取的是最后一个
    os.path.join('D:\','A:\','b')
    
    os.path.getatime() #最后存取时间,返回时间戳
    os.path.getmtime() # 返回时间戳,最后修改时间
    os.path.getsize('文件路径') # 获取文件大小
     
    
    os.path.normcase('路径') # 返回规范化路径,大写盘符转换成小写,根据当前操作系统做转换
    
    
    os.path.normpath('路径') # 按当前平台修改路径分隔符的斜杠,并且会执行里面的..,....返回上级目录
    总结:主要处理路径,不会关心路径是否存在,只是做拼接,剪切,转换等操作,通常与os模块一起使用
    优点:用它处理的路径事可以跨平台的

    3. subprocess ***

    子进程
    进程指的是一个正在运行的程序
    子进程是由另一个正在运行的程序 例如qq聊天点击了一个链接,打开了浏览器,那么浏览器就称之为qq的子进程
    
    为什么使用子进程?当我们有一个任务需要处理,而自己的程序无法处理,所有需要开启另一个程序
    
    例如,在pyhton想要获取所有的进程列表信息(os.system('tasklist'))
    #os.system 在执行系统指令时,也可以命令操作系统启动某个程序
        问题:os.system在执行时有问题,直接把结果输出到控制台,如果想要获取执行的结果,就无能为力了
        
    subprocess 不仅可以启动子进程,还能与子进程进行数据交互
    
    import subprocess
    #dir 表示要执行的命令
    #shell 表示dir是一个命令
    #stdout 指定输出管道
    #管道是什么? 相当于生活中的水管,水可以通过管道从一个地方流到另一个地方
    在程序中,数据相当于水,管道的作用,就是从一个进程中把数据传输到另一个进程,本质上是在读写同一个文件
    
    
    p = subproxess.Popen('dir',shell=True,stdout=subprocess.PIPE)
    print(p.stdout.read())
    # 上面代码是启动了一个子进程,并将结果输出到制定管道
    
    # 启动一个tasklist子进程,指定输出结果到管道中
    p1 = subproxess.Popen('tasklist',shell=True,stdout=subprocess.PIPE)
    # 启动一个findstr的子进程,将p1进程的结果,作为p2进程的输入
    p2 = subproxess.Popen('findstr  cmd', # 要执行的指令
    shell=True, # 第一个参数是否是一个指令
    stdin=p1.stdout,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE) # 表示错误管道,当进程执行出错时,可以在错误管道中获取结果
    # 读取p2进程的结果
    print(p2.stdout.read())
    print(p2.stderr.read().decod('gbk'))
    
    # 总结,当你需要在python中启动一个子进程,并且与它进行数据交互时,就使用subprocess,如果不需要数据交互,可以使用os.system

    4. configparser ****

    配置解析,用来解析配置文件的
    何为配置文件?
    用于编写程序的配置信息的文件
    
    何为配置信息?
    为了提高程序的扩展性,我们会把一些程序中需要用到的值交给用户来确定,比如迅雷的下载目录
    
    配置文件的编写格式
    
    只允许两种数据类型
    section(分区),option(选项)
    #这是一个section(分区)
    [mysql]
    #这是一个option(选项)
    username = jack # 不用加引号,这里数据都是字符串
    password = 123
    
    # 注意:分区名称不能重复
    # 同一个分区下,不能有重复option
    
    configparser在read的时候,如果文件不存在,会自动创建文件
    
    import configparser
    # 创建一个配置文件解析器
    cfg = configparser.ConfigParser()
    # 读取名为test.cfg的配置文件
    ctg.read('test.cfg'.encoding='utf-8')
    
    #获取分区
    print(cfg.sections())
    
    # 获取某个分区下的某个选项,第一个参数分区名,第二个选项名称
    username = cfg.get('mysql','username')
    print(username)
    
    password = cfg.get('mysql','password')
    print(type(password)) # str类型
    
    lock = cfg.getboolean('mysql','lock') # 帮忙转换数据类型
    print(type(lock))
    # 以下三个函数是帮你封装了类型转换
    cfg.getfloat()
    cfg.getint()
    cfg.getboolean()
    
    # 读取配置信息 两步
    1.读取某个配置文件
    2.调用get函数

    config文件的增删改

    #修改
    cfg = configparser.ConfigParser()
    cfg.read('test.cfg',encoding='utf-8')
    
    #将mysql分区下的lock改为True
    cfg,set('mysql','lock','true')
    with open('test.config','wt',encoding='utf-8') as f:
        cfg.write(f)
    
    #增加新分区
    cfg.add_section('新分区')
    #增加新选项port,值为3306
    cfg,set('mysql','port','3306')
    with open('test.config','wt',encoding='utf-8') as f:
        cfg.write(f)
        
    # 删除分区
    cfg.remove_section('新分区')
    # 删除某分区的选项
    cfg.remove_option('mysql','port')
    
    # 作为配置文件,最常用的操作就是读取配置信息,很少会做修改
    # 总结:read读取配置文件
    add_section 添加分区
    set 如果没有这个选项则添加,否则修改
    remove_section 删除分区
    remove_option 删除选项
    
    cfg.has_section # 判断是否有分区
    cfg.has_option # 判断是否有选项

    5. shutil模块

    shutil是一个工具包,封装了文件高级操作,让你操作起来更方便
    功能看起来与os有些重叠,os只能帮你处理文件夹是否存在,路径是否正确,无法直接完成copy等操作
    
    还提供了压缩与解压缩
    
    
    
    shutil.ignore_patterns('mp3','*.py') # 忽略mp3和.py后缀文件
    shutil.copytree() 拷贝目录
    
    
    import shutil
    shutil.copyfile('源文件路径','目标文件路径')
    
    #压缩文件 支持的格式zip和tar
    shutil.make_archive('要压缩的文件名','zip','压缩文件放到的路径名')
    make_archive中的第四个参数base_dir也是用来指定压缩的路径,与root_dir的区别
    #root_dir仅压缩指定路径下的内容
    #base_dir 压缩时,会将指定的路径下的内容,与其完整的文件层级一并压缩
    #当指定base_dir时,root_dir不生效
    
    shutil.make_archieve('test','zip',root_dir='day20')
    
    shutil.make_archieve('test','zip',root_dir='day20',base_dir='day20')
    
    #解压文件
    shutil.unpack_archive('解压的文件路径','解压到的路径名','zip')
    
    shutil实际上调用了zipfile,tarfile模块
    import zipfile
    import tarfile
    
    # 总结:shutil模块 copy文件 压缩文件时使用

    day2 ATM+购物车 day3 面向对象基础 day4 面向对象进阶 day5 面向对象高级

  • 相关阅读:
    SharePoint Framework (SPFx) 开发入门教程
    SharePoint 2013 Designer 入门教程
    SharePoint 2013 开发教程
    SharePoint 2013 入门教程
    SharePoint Online 部署SPFx Web部件
    SharePoint Online SPFx Web部件绑定数据
    SharePoint Online 创建SPFx客户端Web部件
    SharePoint Online 配置框架(SPFx)开发环境
    SharePoint Online 创建应用程序目录
    SharePoint Online 启用 IRM
  • 原文地址:https://www.cnblogs.com/shanau2/p/10102222.html
Copyright © 2011-2022 走看看