os模块,os.path模块,subprocess模块,configparser模块,shutil模块

时间:2021-12-09 13:07:25

1.os模块

os表示操作系统
该模块主要用来处理与操作系统相关的操作
最常用的文件操作
打开 读入 写入 删除 复制 重命名

os.getcwd() 获取当前执行文件所在的文件夹路径
os.chdir("dirname") 改变当前脚本工作目录
os.curdir 返回当前目录的字符串表现方式: 结果('.')
os.pardir 获取当前目录的父目录字符串名:结果('..')
os.makedirs('a/b/c') 可生成多层递归目录,如果不存在,可以自动创建中间的目录
os.mkdir('a/b/c') 生成单级目录,会把a,b当成已存在的路径,如果不存在就会报错
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印,\
列表里面只是文件的名称.需要手动拼接其完整路径
os.remove() 删除一个文件
# 如果要删除一个文件夹 而且文件夹不为空 ,思路是 先遍历这个文件夹中的所有文件和文件夹
# 先把里面的内容全部删除 最后再删除文件夹
有一个文件夹a,里面包含了一个a.txt的文件
path=r'E:\python-li\课堂\day19\a'
for f in os.listdir('a'):#得到的f只是字符串类型的文件名
  f_path=path+'\\'+'a.txt'#将其改为文件路径的格式
  print(f_path)
  os.remove(f_path)
os.rmdir('a')

os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/",当你的程序需要跨平台时,路径分隔符不能直接写死要从os中获取
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令(系统命令),直接显示它在执行系统指令时,也可以命令操作系统启动某个程序
os.environ 获取系统环境变量

什么时候使用os 当需要操作文件及文件夹的时候
重点放在对文件的增删改查

2.os.path模块

path翻译为路径
该模块用于处理路径
之所以用这个模块是因为python的跨平台,各平台的路径书写方式不同,所以将所有与路径相关都进行了封装

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 依据:第一个字符是不是路径分割符合,是表示绝对路径
print(os.path.isabs(r'E:\python-li\课堂\day19')) 结果:True
print(os.path.isabs(r'python-li\课堂\day19')) 结果:False
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的文件夹,则返回True。否则返回False
os.path.join(path1,path2) 以当前平台的路径分隔符来进行拼接.如果有多个盘符,取得是最后一个
print(os.path.join('D:\\','a')) 结果:D:\a
print(os.path.join('D:\\','E:\\','a')) 结果:E:\a
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小

#返回规范化路径 大写变成小写,反斜杠变成正斜杠
print(os.path.normcase(r'E:\python-li\课堂/day19\os模块.py'))
结果:e:\python-li\课堂\day19\os模块.py

# 规范化路径但大写不变小写 并且 会执行里面..(用于返回上一级目录)
print(os.path.normpath(r'E:\python-li\\课堂//day19\os模块.py\..'))
结果:E:\python-li\课堂\day19
print(os.path.normpath(r'E:\python-li\\课堂\day19\os模块.py\..\..'))
结果:E:\python-li\课堂

#获取项目根目录
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__))

总结:主要处理路径 不会关系路径是否存在 只是做拼接 剪切 转换等等操作
通常是与os一起使用
优点: 用它处理的路径是可以跨平台的

3.subprocess模块

# '''
# subprocess 翻译为子进程
# 进程指的是正在运行的程序
# 子进程 是有另一个正在运行的程序启动的程序 例如:qq聊天 点击了一个连接 打开了浏览器 那么浏览器称之为qq的子进程
# 为什么使用子进程?
# 当我们有一个任务需要处理 而自己的程序无法处理 所以需要开启另一个程序
# 在python中想要获取所有的进程(任务列表)信息
# '''
# import os
# os.system(r"F:\QQ2016\Bin\QQScLauncher.exe")
# os.system('dir')
#它在执行系统指令时,也可以命令操作系统启动某个程序
#os.system在执行时 直接把结果输出到了控制台 如果我们要获取执行的结果就无能为力了
#subprocess不仅可以启动子进程,还能与子进程进行数据交互

import subprocess
#dir 表示要执行命令
#shell 表示dir是一个命令
#stout 指定输出的管道
#管道是什么? 相当于生活中的水管 从一个地方流到另一个地方
#在程序中,数据相当于水 管道的作用,就从一个进程中把数据输到另一个进程
#本质是读写同一个文件
# p = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
# print(p.stdout.read())
#读一次指针到达文件的末尾,再次读就没有数据

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

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

4.configparser模块

configparser,翻译为配置解析,很显然,它是用来解析配置文件的
何为配置文件?
用于编写程序的配置信息的文件
何为配置信息?
为了提高程序的扩展性,我们会把一些程序中需要用到的值交给用户来确定,比如迅雷的下载目录,同时下载数,qq的提示音等.
作为配置信息的数据,应满足两个条件
1.数据的值不是固定的
2.可以由用户来指定
例如:我们做一个登录功能,为了方便使用我们可以将用户的用户名密码写到配置文件中,可以不需要内次都输入

配置文件编写格式
配置文件中只允许出现两种类型的数据
第一种 section分区 方括号中十分区的名称 例如[ATM]
第二种 option选项 名称=值
注意:
不能出现重复的分区名
同一分区下不能有相同的选项名

在test.cfg中:
#这是一个section(分区)
[mysql]
#这是一个option(选项)
username = henry
password = 123
lock = false
#注意分区名不能重复
#同一个分区下 不能有重复option
[django]

在configparser模块中:
import 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))

password=cfg.get('mysql','password')
print(password)
print(type(password))

lock=cfg.getboolean('mysql','lock')
print(type(lock))
print(lock)

#以下三个类型
cfg.getfloat()
cfg.getint()
cfg.getboolean()

#读取配置信息 两步
1.读取某个配置文件
2.调用get函数

configparser的增加修改删除

#修改
import configparser
cfg=configparser.ConfigParser()
cfg.read('test.cfg',encoding='utf-8')
#将mysql分区下的lock值改为True
cfg.set('mysql','lock','true')
with open('test.cfg','wt',encoding='utf-8') as f:
cfg.write(f)

#增加
import configparser
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)

#删除
import configparser
cfg=configparser.ConfigParser()
cfg.read('test.cfg',encoding='utf-8')
#删除分区
cfg.remove_section('新分区')
#删除某分区的选项
cfg.remove_option('mysql','port')
with open('test.cfg','wt',encoding='utf-8') as f :
cfg.write(f)

#判断是否存在某个分区
print(cfg.has_section('mysql'))
#判断是否存在某个选项
print(cfg.has_option('mysql','username'))

#作为配置文件 最常用的操作就是读取配置信息 很少会做修改
#总结:
read读取配置文件注意要写encoding
add_section添加新分区
set 如果没有这个选项则添加,有则修改
remove_section 删除分区
remove_option 删除选项

5.shutil模块

shutil模块是一个工具包,封装了文件高级操作,让你操作更方便

功能与os有些重叠,os只能帮你处理文件是否存在,路径是否正确等,无法直接完成copy等操作,而shutil提供了压缩与解压缩
import shutil
#copy文件
shutil.copyfile(r'E:\python-li\课堂\day19\os模块.py',\
      r'E:\python-li\课堂\day19\os模块2.py')
#压缩文件 支持的格式zip 和tar
shutil.make_archive('day19','zip',r'E:\python-li\课堂')
shutil.make_archive('os.path','tar',r'E:\python-li\课堂\day19')
#解压缩
shutil.unpack_archive(r'E:\python-li\课堂\day19\day19.zip',
          r'E:\python-li\课堂\day19\day19\解压的文件夹.zip'
          r'zip')
总结:拷贝文件,压缩解压缩文件
make_archive 中的第四个参数 base_dir 也是用来指定要压缩的路径,与root_dir的区别
#root_dir 仅仅压缩指定的路径下的内容
#base_dir 会将指定的路径下的内容 与其完整的文件层级一并压缩
#当指定base_dir时root_dir不生效