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模块提供的功能
原文地址:https://www.cnblogs.com/liuxiaolu/p/10097677.html