一: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.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一起使用。
优点:用它处理的路径是可以跨平台的。
二: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) 移动目录和文件