• os模块、subprocess模块、configparser模块、shutil模块


    一:os模块与os.path

      os表示操作系统:

        该模块主要处理与操作系统相关的操作,最常用的是文件操作(打开,读取,写入,删除,复制,重命名)

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径(当前执行文件所在的文件夹)
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')(获取当前目录的字符串表达形式)
    os.pardir  获取当前目录的父目录字符串名:('..')
    os.makedirs('dirname1/dirname2')    可生成多层递归目录(创建多级目录,如果不存在,可以自动创建中间的目录)
    os.mkdir('a/b/c')   只能创建单级目录,会被a和b当成已经存在的路径
    os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印    注意:listdir得到的是文件名称,需要手动拼接完整路径,例如:
    #
    path = r"D:脱产5期内容day19"
    for f in os.listdir("b"):
        f_path = path + "\"  + f
        os.remove(f_path)
    os.rmdir("b")
    #
    os.remove()  删除一个文件
    os.rename("oldname","newname")  重命名文件/目录
    os.stat('path/filename')  获取文件/目录信息
    os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep    输出当前平台使用的行终止符(获取换行符),win下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示。(执行系统命令)
    os.environ  获取系统环境变量
    os.path.abspath(path)  返回path规范化的绝对路径
    os.path.split(path)  将path分割成目录和文件名二元组返回
    os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path)  返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)  如果path是绝对路径,返回True
    os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小
    os的用法

    当需要操作文件及文件夹的时候,使用os模块,重点放在文件的增删改查。

      os.path模块:

        path翻译为路径,该模块用于处理路径,之所以有这个模块,是因为python是跨平台的,每个平台的书写方式不同,所以将所有与路径相关的都进行了封装,使用了path之后,程序就是跨平台的,不会因为路径而长生错误。

    # 将路径分割为文件夹和文件名
    # print(os.path.split(r"D:脱产5期内容day19path模块"))
    
    # 获取路径中的文件夹路径
    # print(os.path.dirname(r"D:脱产5期内容day19path模块path模块.py"))
    # 获取路径中的文件名称
    # print(os.path.basename(r"D:脱产5期内容day19path模块path模块.py"))
    
    # 判断一个路径是否存在
    # print(os.path.exists(r"D:脱产5期内容day19path模块path模块.py"))
    
    # 判断是否是绝对路径    依据是  第一个字符 是不是路径分割符合  是表示绝对路径
    # print(os.path.isabs(r"脱产5期内容day19path模块"))
    
    
    
    # 不是一个文件 必然是一个文件夹
    # 判断路径是否是一个文件
    # print(os.path.isfile(r"D:脱产5期内容day19path模块path模块.py"))
    #
    # # 判断路径是否是一个文件夹
    # print(os.path.isdir(r"D:脱产5期内容day19path模块path模块.py"))
    #
    # # 以当前平台的路径分割符来拼接路径   如果有多个盘符 取得是最后一个
    # print(os.path.join("D:\","A:\","b"))
    #
    # # 获取文件大小
    # print(os.path.getsize(r"D:脱产5期内容day19path模块path模块.py"))
    #
    # # 获取最后存取时间
    # print(os.path.getatime(r"D:脱产5期内容day19path模块path模块.py"))
    #
    # # 获取最后修改时间
    # print(os.path.getmtime(r"D:脱产5期内容day19path模块path模块.py"))
    
    # 返回规范化路径 大写变成小写,反斜杠变成正斜杠
    # print(os.path.normcase(r"D:/脱产5期内容/day19/path模块/path模块.py"))
    
    # 把反斜杠 转为正斜杠  并且 会执行里面..(用于返回上一级目录)
    # print(os.path.normpath(r"D:脱产5期内容/day19path模块........"))
    os.path的用法

    主要处理路径,不会关心路径是否存在,只是做拼接,剪切,转换等操作。通常与os一起使用。

    优点:用它处理的路径是可以跨平台的。

    二:subprocess模块

      subprocess翻译为子进程。

      进程指的是正在运行的程序

      子进程:是由另一个正在运行程序启动的程序。例如:qq聊天,点击了一个链接,打开了一个浏览器,那么浏览器称之为qq的子进程。

      为什么使用子进程?

        当我们有一个任务需要处理,而自己的程序无法处理时,就需要开启另一个程序来处理。

    如下示例:dir 表示要执行命令
         shell :表示dir是一个命令
         stdout:指定输出管道(管道相当于程序中的水管,数据相当于水,管道的作用就是从一个进程中把数据传输到另一个进程,本质上是读写同一个文件)

    p = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE)

    启动一个tasklist子进程 指定输出结果到管道中
    p1 = subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)
    
    启动一个findstr的子进程 将p1进程的结果作为p2进程输入
    p2 = subprocess.Popen("findstr cmd", # 要执行的指令
                          shell=False,# 第一个参数是否是一个指令
                          stdin=p1.stdout, # 指定输入管道
                          stdout=subprocess.PIPE,#指定输出管道
                          stderr=subprocess.PIPE) # 表示错误管道   当进程执行出错时 可以在错误管道中获取结果
    
    读取p2进程的结果
    print(p2.stdout.read())
    print(p2.stderr.read().decode("GBK"))
    示例

      总结:os.system在执行系统指令时,也可以命令操作系统启动某个程序,但是在执行时是将结果直接输出到了控制台,如果我们要获取执行的结果,就无能为力了。而subprocess不仅可以启动子进程,还能与子进程进行数据交互。

      所以当需要在python中启动一个子进程,并且它进行数据交互时就使用subprocess,如果不需要数据交互,可以使用os.system.

    三:configparser模块

    配置文件编写格式:

      配置文件只允许出现两种类型的数据

        第一种section分区,方括号内是分区的名称,例如:[ATM]

        第二种option选项,名称 = 值

      注意:

        不能出现重复的分区名

        同一个分区下不能有相同的选项名

        值可以是任何类型且字符串不需要加引号

    先创建test.cfg文件,然后在configparser模块中配置文件内容

    # 创建一个配置文件解析器
    cfg = configparser.ConfigParser()
    # 读取名为test.cfg的配置文件
    cfg.read("test.cfg",encoding="UTF-8")
    # 获取分区
    print(cfg.sections())
    
    # 获取某个分区下的某个选项 第一个参数分区名 第二个选项名称
    username = cfg.get("mysql","username")
    print(username)
    print(type(username))
    
    以下三个函数是帮你封装了 类型转换
    cfg.getfloat()
    cfg.getint()
    cfg.getboolean()
    
    例如:转换为布尔型
    lock = cfg.getboolean("mysql","lock")
    print(type(lock))
    print(lock)

    读取配置信息两步:

      1.读取某个配置文件

      2.调用get函数

    configparser的增加,修改,删除:

    修改
    cfg = configparser.ConfigParser()
    cfg.read("test.cfg",encoding="utf-8")
    
    #(set设置分区,选项,值)
    # 将mysql分区下的lock改为True
    cfg.set("mysql","lock","true")
    
    #改完需要写回去,用文件操作
    with open("test.cfg","wt",encoding="UTF-8") as f:
        cfg.write(f)
    
    
    # 添加新的选项  port 值为3306
    cfg = configparser.ConfigParser()
    cfg.read("test.cfg",encoding="utf-8")
    
    
    # 添加新的分区
    cfg.add_section("新分区")
    # 添加新的选项  port 值为3306
    cfg.set("mysql","port","3306")
    
    with open("test.cfg","wt",encoding="UTF-8") as f:
        cfg.write(f)

    删除:

    # 删除
    cfg = configparser.ConfigParser()
    cfg.read("test.cfg",encoding="utf-8")
    
    # 删除分区
    cfg.remove_section("新分区")
    # 删除某个分区的选项
    cfg.remove_option("mysql","port")
    
    # 判断是否存在某个分区
    print(cfg.has_section("mysql"))
    # 判断是否存在某个选项
    print(cfg.has_option("mysql","username"))
    
    with open("test.cfg","wt",encoding="UTF-8") as f:
        cfg.write(f)

    作为配置文件,最常用的操作就是读取,很少会做修改。

    总结:read读取配置文件

    add_section 添加分区

    set  如果没有这个选项则添加

    remove_section   删除分区

    remove_option    删除选项

    四:shutil模块

      是一个工具包,封装了文件高级操作,让你操作起来更加方便,功能与os有些重叠,os只能帮你处理文件是否存在,路径是否正确等,无法直接完成copy等操作。

      shutil模块还提供了压缩与解压缩

    import shutil  
    # 复制文件
    # shutil.copyfile(r"D:脱产5期内容day19shutil模块shutil模块.py",
    #                 r"D:脱产5期内容day19shutil模块shutil模块.py2")
    
    # 压缩文件  支持的格式 zip 和tar
    shutil.make_archive("shutil模块",
                        "zip",
                        r"D:脱产5期内容day19") 
    
    
    # 解压缩
    # shutil.unpack_archive(r"shutil模块.zip",
    #                       r"D:脱产5期内容day19shutil模块解压的文件夹",
    #                       r"zip")
      提供的功能:
        shutil.copyfileobj   拷贝文件 提供两个文件对象 长度表示缓冲区大小
        shutil.copyfile(src, dst) 拷贝文件 提供两个文件路径 
        shutil.copymode()  拷贝文件权限 提供两个文件路径
        shutil.copystat(src, dst) 拷贝文件状态信息 最后访问 最后修改 权限 提供两个文件路径
        shutil.copy(src, dst) 拷贝文件和权限   提供两个文件路径
        shutil.copy2(src, dst) 拷贝文件和状态信息 提供两个文件路径
    ​
        shutil.ignore_patterns("mp3","*.py")
        shutil.copytree(src, dst, symlinks=False, ignore=None) 拷贝目录  
        symlinks默认False将软连接拷贝为硬链接  否则拷贝为软连接
    ​
        shutil.rmtree 删除目录 可以设置忽略文件
        shutil.move(src, dst)   移动目录和文件
    shutil模块提供的功能
  • 相关阅读:
    EF6的DbContext动态连接字符串
    Swagger配置
    Xamarin学习资源收集
    xmarin开发问题收集
    javascript基础
    Vue3.0到底带来来哪些变化视频笔记1
    Git操作
    EFCore 通过数据库生成模型
    Web Deploy远程发布
    ASP.NET CORE系列【七】分析NetCore启动原理
  • 原文地址:https://www.cnblogs.com/liuxiaolu/p/10097677.html
Copyright © 2020-2023  润新知