一、os 模块
-
os 表示操作系统,该模块主要处理与操作系统相关的操作,最常用的是文件操作打开,读取,写入,删除,复制,重命名。
#当前执行文件所在的文件夹路径 print(os.getcwd()) #修改当前的工作目录 os.chdir(r"D:\Program Files\Python\zdc") print(os.getcwd()) #D:\Program Files\Python\zdc #获取当前目录的 字符串表现方式 . print(os.curdir) #获取当前目录的 字符串表现方式 .. print(os.pardir) #递归创建多级目录 os.makedirs("a/b/c") #创建单级目录,会把c1和a1当成已存在的路径 os.mkdir("c1/a1/b1") #删除文件夹,文件夹是空的才能删除 os.rmdir("a") #获取文件或目录信息 print(os.stat('模块.py')) #获取获取当前的路径分割符,当你的程序要跨平台时,路径分隔符不能直接写死,要从os中获取 print(os.sep) #获取换行符 print(os.linesep) #执行系统命令 print(os.system("dir")) #获取系统的环境变量 print(os.environ)
小练习:
#如果要删除一个文件夹,而且文件夹不为空,思路是:先遍历这个文件夹中的所有文件和文件夹 #先把里面的内容全部删除,最后再删除文件夹 #要删除的文件路径 path = r"D:\Program Files\Python\zdc\day19\b" for f in os.listdir("b"): f_path = path + "\\" + f os.remove(f_path) os.rmdir("b") #注意遍历删除文件时,listdir 得到的是文件名称,需要手动拼接完整路径
二、os.path 模块
-
path 翻译为路径,该模块用于处理路径,之所以用这个模块,是因为python是跨平台的,各平台的路径书写方式不同,所以将所有与路径相关都进行了封装,使用了path后。你的程序就是跨平台的,不会因为路径而产生错误
import os #返回绝对路径 其实就是把当前执行文件所在的文件夹 与你给的参数做了拼接 print(os.path.abspath("path模块.py")) #将路径分割为文件夹和文件名 print(os.path.split(r"D:\Program Files\Python\zdc\day19\模块.py")) #('D:\\Program Files\\Python\\zdc\\day19', '模块.py') #获取路径中的文件夹路径 print(os.path.dirname(r"D:\Program Files\Python\zdc\day19\模块.py")) #D:\Program Files\Python\zdc\day19 #获取路径中的文件名称 print(os.path.basename(r"D:\Program Files\Python\zdc\day19\模块.py"))#周六作业.py #判断一个路径是否存在 print(os.path.exists(r"D:\Program Files\Python\zdc\day19\模块.py"))#True #判断是否是绝对路径 print(os.path.isabs(r"D:Program Files\Python\zdc\day19\模块.py"))#False #判断路径是否是一个文件 print(os.path.isfile(r"D:\Program Files\Python\zdc\day19\模块.py")) #True #判断路径是否是一个文件夹 print(os.path.isdir(r"D:\Program Files\Python\zdc\day19\模块.py")) #False #以当前平台的路径分割符来拼接路径 print(os.path.join("D:\\",b")) #获取文件大小 print(os.path.getsize(r"D:\Program Files\Python\zdc\day19\模块.py")) #获取最后存取时间 print(os.path.getatime(r"D:\Program Files\Python\zdc\day19\模块.py")) #获取最后修改时间 print(os.path.getmtime(r"D:\Program Files\Python\zdc\day19\模块.py")) #返回规范化路径 大写变成小写,反斜杠变成正斜杠 print(os.path.normcase(r"D:\Program Files/Python\zdc\day19\模块.py"))#d:\program files\python\zdc\day19\模块.py #把反斜杠转为正斜杠并且会执行里面..(用于返回上一级目录) print(os.path.normpath(r"D:\Program Files/Python\zdc\day19\模块.py\..\..\..")) #D:\Program Files\Python
总结:主要处理路径 不会关系路径是否存在 ,只是做拼接、剪切、转换等等操作
通常是与os一起使用
优点:用它处理的路径是可以跨平台的
示范:
#===============================>settings.py import os #获取的是项目根目录 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # 拼接userData的完整路径,为了跨平台 建议os.path来处理路径 USERDATA_PATH = os.path.join(BASE_DIR,"db","userData") #db为文件夹,userData为文件 #===============================>start.py import sys import os #添加环境变量 sys.path.append(os.path.dirname(os.path.dirname(__file__))) #导入配置文件 from conf import settings #访问配置文件中用户数据的路径 print(settings.USERDATA_PATH)
三、shutil 模块
-
shutil模块是一个工具包,封装了文件高级操作,让你操作起来更方便,功能与os有些重叠,os 只能帮你处理文件是否存在,路径是否正确等,无法直接完成copy等操作
import shutil #拷贝文件 shutil.copyfile(r"D:\Program Files/Python\zdc\day19\模块.py",r"D:\Program Files/Python\zdc\day19\模块.py2") #压缩文件,支持的格式zip和tar shutil.make_archive("shutil模块", "zip", r"D:\Program Files/Python\zdc\day19", "D:\Program Files/Python\zdc\day19\这是压缩后的文件") #解压缩 shutil.unpack_archive(r"shutil模块.zip", r"D:\Program Files/Python\zdc\day19\shutil模块\解压的文件夹", r"zip")
总结:shutil模块在copy文件、压缩文件、解压文件时使用
四、subprocess 模块
- subprocess 翻译为子进程,进程指的是正在运行的程序,子进程是由另一个正在运行程序启动的程序。例如qq聊天点击了一个连接打开了浏览器 那么浏览器称之为qq的子进程。
- 为什么使用子进程:当我们有一个任务需要处理而自己的程序无法处理所以需要开启另一个程序
import os
os.system(r'"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"') #打开qq
res = os.system("dir")
print(res)
#os.system 在执行系统指令时,也可以命令操作系统启动某个程序
#os.system在执行时直接把结果输出到了控制台,如果我们要获取执行的结果就无能为力了
subprocess 不仅可以启动子进程,还能与子进程进行数据交互
import subprocess
# dir 表示要执行命令
# shell 表示dir是一个命令
# stdout 指定输出管道
# 管道是什么? 相当于生活中的水管,水可以通过管道从一个地方流到另一个地方
# 在程序中数据相当于水,管道的作用就从一个进程中把数据传输到另一个进程
# 本质上是读写同一个文件
p = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE)
print(p.stdout.read().decode('gbk'))
import subprocess
#启动一个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) # 表示错误管道
print(p2.stdout.read())
print(p2.stderr.read().decode("GBK"))
#打印结果和在cmd中执行 tasklist | findstr cmd 命令结果一样
总结:当你需要在python中启动一个子进程,并且它进行数据交互时就使用subprocess
如果不需要数据交互,可以使用os.system
五、configparser 模块
- 读取配置信息
- 读取某个配置文件
- 调用get函数
#===========================>test.cfg内容
[mysql]
username = jack
password = 123
lock = true
[django]
import configparser
#创建一个配置文件解析器
cfg = configparser.ConfigParser()
# 读取名为test.cfg的配置文件
cfg.read("test.cfg",encoding="UTF-8")
# 获取分区
print(cfg.sections()) #['mysql', 'django']
import configparser
cfg = configparser.ConfigParser(
cfg.read("test.cfg",encoding="UTF-8")
# 获取某个分区下的某个选项 第一个参数分区名 第二个选项名称
username = cfg.get("mysql","username")
print(username) #jack
print(type(username)) #<class 'str'>
password = cfg.get("mysql","password")
print(password) #123
print(type(password)) #<class 'str'>
print(int(password))
lock = cfg.get("mysql","lock")
print(lock) #true
print(type(lock)) #<class 'str'>
print(bool(lock)) #True
#以下三个函数是帮你封装了 类型转换
# cfg.getfloat()
# cfg.getint()
# cfg.getboolean()
- 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读取配置文件
add_section 添加分区
set 如果没有这个选项则添加
remove_section 删除分区
remove_option 删除选项