• 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 面向对象高级

  • 相关阅读:
    FastDFS
    目前存在的问题
    MongoDB JAVA开发
    [Linux] Hexo 搭建个人博客
    新目标
    1年之后的拿高工资的资本,Java线程
    Oracle在VMware虚拟机安装的配置
    adb命令关闭打开手机wifi开关
    ADB命令横竖屏切换、关闭打开wifi
    使用adb命令提取安卓手机中安装的apk
  • 原文地址:https://www.cnblogs.com/shanau2/p/10102222.html
Copyright © 2020-2023  润新知