20181210(os,os.path,subprocess,configparser,shutil)
os表示操作系统,该模块主要处理与操作系统相关的操作。最常用的是文件操作:打开,读取,删除,复制,重命名。
重点掌握增删改查的函数操作。
import os
# 获取当前执行文件所在文件夹路径
print(os.getcwd())
输出结果:
C:\Users\wangt\PycharmProjects\new\20181210
# 修改当前的工作目录(将当前文件挪到目标文件夹中)
os.chdir("想要切换到的目标文件夹") #没有返回值
# 获取当前目录的字符串表现方式
print(os.curdir) #(输出结果为.)
# 获取当前目录的父级的字符串表现方式
print(os.pardir) #(输出结果为..)
# 创建多级目录,可以自动创建中间的目录
os.makedirs("a/b/c")
# 输出结果为在当前执行文件夹下新建了三级文件夹
# 只能创建单级目录 会把c1和c2当成已存在的路径
os.mkdir("c1/c2/b3")
# 输出结果为在当前文件夹下的c1/c2文件夹下创建了b3文件夹
# 删除一个文件夹,必须保证文件夹是空的,才能删除
os.rmdir("文件夹名称") # 同级目录直接输文件夹名称,或者输入文件夹路径
# 如果要删除一个不为空的文件夹。思路是先遍历这个文件夹中的所有文件和文件夹,先把里面的内容全部删除,最后再删除文件夹
# 注意遍历删除文件时,listdir得到的是文件名称,需要手动拼接完整路径
path = r"C:\Users\wangt\PycharmProjects\new\20181210\aa" #想要删除的文件夹路径
for f in os.listdir("aa"):
f_path=path+"\\"+f #两个\\,第一个表示转义,相当于拼接出文件的路径
os.remove(f_path)
os.rmdir("aa")
结果是文件夹aa都被删除(aa文件夹与当前执行文件同级)
# 获取文件属性
print(os.stat("test.py"))
# 获取当前的路径分隔符,当程序需要跨平台时,路径不能直接写死,要从os中获取。
print(os.sep)
windows下输出结果为:\
# 获取当前平台使用的换行符
print(os.linesep)
# 执行系统命令
os.system()
例如:os.system("dir")
# 显示当前操作系统的环境变量 (path是pycharm下的环境变量)
print(os.environ)
2、os下path小模块的使用
path是os下的一个小模块,path意为路径,该模块用于处理路径相关问题,通常与os模块一起使用。
之所以用这个模块,是因为python是跨平台的,各平台的路径书写方式不同,所以将所有与路径相关的都进行了封装,使用了path后,程序在跨平台时就不会因为路径问题报错了
# 返回绝对路径,其实就是把当前执行文件所在的文件夹与用户给的参数进行拼接
print(os.path.abspath("test.py"))
输出结果:
C:\Users\wangt\PycharmProjects\new\20181210\test.py
# 将路径分割为文件夹和文件名
print(os.path.split(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
输出结果: #一个元组,两个元素
('C:\\Users\\wangt\\PycharmProjects\\new\\20181210', 'test0.py') #双反斜杠是为了转义
# 获取路径中的文件名称
print(os.path.basename(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
输出结果:
test0.py
# 获取路径中的文件夹路径
print(os.path.dirname(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
输出结果:
C:\Users\wangt\PycharmProjects\new\20181210
# 判断一个文件路径是否存在
print(os.path.exists(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
输出结果为True或者False
# 判断文件是否是绝对路径,判断依据:第一个字符是不是路径分隔符,如果是则表示是绝对路径
print(os.path.isabs(r"C:\Users\wangt\PycharmProjects\new\20181219"))
输出结果为True或者False
# 判断路径是否是一个文件
print(os.path.isfile(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py")) #输出结果为True或者False
# 判断路径是否是一个文件夹
print(os.path.isdir(r"C:\Users\wangt\PycharmProjects\new\20181210)) #输出结果为True或者False
# 以当前平台的路径分隔符来拼接路径,如果有多个盘符,取最后一个。
print(os.path.join("a","b"))
print(os.path.join("A:\\","B:\\","b")) #A会被忽略
输出结果为:
a\b
B:\b
import os
# 获取项目的根目录
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# 拼接userData的完整路径,为了跨平台,使用os.path来处理路径
USERDATA_PATH = os.path.join(BASE_DIR,"DB","userData")
import sys,os
# 添加环境变量
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
# 导入配置文件
from conf import settings
# 访问配置文件中的用户数据路径
print(settings.USERDATA_PATH)
# 文件或者目录的最后存取时间
print(os.path.getatime(path))
# 文件或者目录的最后修改时间
print(os.path.getmtime(path))
# 返回文件大小
print(os.path.getsize(path)) # 输出结果单位为字节
# 返回规范化路径,大写变成小写,斜杠变成当前平台对应的斜杠等
print(os.path.normcase(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
# 斜杠转换成当前系统对应的斜杠,同时还可以向上返回,得到上级路径
print(os.path.normpath(r"C:\Users\wangt\PycharmProjects\new\20181210\..")) #单次最多返回两级
print(os.path.normpath(r"C:\Users\wangt\PycharmProjects\new\20181210\..\..")) #向上四级
3、subprocess
subprocess称之为子进程,进程就是一个正在运行的程序,子进程是由另一个程序启动的程序。
使用子进程的目的:当程序自身无法处理某项任务时,需要通过另一个程序来处理,也就是子进程。
os.system在执行系统指令时,也可以命令操作系统启动某个程序。
os.system在执行时,直接把结果输出到了控制台,无法获取执行结果
subprocess不仅可以启动子进程,还能与子进程进行数据交互
当需要在python中启动一个子程序,并且可以进行数据交互时就是用subprocess。如果不需要数据交互,就使用os.system
import subprocess
dir表示要执行的命令
shell表示dir是一个命令
stdout指定输出管道:管道的作用就是把数据传输到另一个进程中,本质上就是读写同一个文件
# 启动一个dir子进程,并将结果输出到指定管道
p = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE)
print(p.stdout.read()) #stdout输出
# 启动一个tasklist子进程,指定输出结果到管道中
p1=subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)
# 启动一个findstr子进程,将p1进程的结果作为p2进程输入
p2=subprocess.Popen("findstr cmd", #要执行的指令
shell=True, #第一个参数是否是一个指令,这个默认是False。
stdin=p1.stdout, #指定输入管道
stdout=subprocess.PIPE, #指定输出管道
stderr=subprocess.PIPE) #stderr 表示错误管道,当进程执行出错时,可以在错误管道中获取结果。
# 读取p2进程的结果
print(p2.stdout.read())
print(p2.stderr.read().decode("GBK")) #国内win默认GBK
4、configparser 配置解析文件
作为配置信息的数据,要满足两个条件:
1、数据的值是不固定的
2、可以由用户来指定
读取配置信息分为两步:
1、读取某个配置文件
2、调用get()函数
标准配置文件应为configparser文件夹下的.cfg文件。
一份文件可以有多个section分区,分区之间不能重名。
同一个分区下,option也不能重名。
[mysql] # 这是分区,中括号内写分区名字,分区名不能重复
username = jack # 这是一个option(选项)
password = 123 # 所有option左右两端全都会被默认设置成字符串。
lock = true
[django] #这也是分区
import configparser
# 创建一个配置文件解析器
cfg = configparser.ConfigParser()
# 读取名为test.cfg的配置文件
cfg.read("test.cfg",encoding="UTF-8")
# 获取分区
print(cfg.sections())
输出结果为:
['mysql', 'django'] # 得到列表
# 获取某个分区下的某个选项 第一个参数分区名 第二个选项名称
username = cfg.get("mysql","username")
print(username)
print(type(username))
输出结果:
jack
<class 'str'>
password = cfg.get("mysql","password")
print(password)
print(type(password))
print(int(password))
输出结果为:
123
<class 'str'>
123 # 默认都是字符串,想计算就要先修改数据类型
# 改换布尔值
lock = cfg.getboolean("mysql","lock")
print(type(lock))
print(lock)
输出结果为:
<class 'bool'>
True
# 以下三个函数是帮你封装了 类型转换
cfg.getfloat() # 转换成浮点数
cfg.getint() #转换成整数
cfg.getboolean() #转换成布尔值
5、configparser 增删改操作
作为配置文件 最常用的操作就是读取,很少会做修改 总结: read读取配置文件 add_section 添加分区 set 如果没有这个选项则添加 remove_section 删除分区 remove_option 删除选项
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)
# 添加新的分区
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")) # 返回值为布尔值
6、shutil 增删改操作
该模块提供比os模块更加丰富的文件操作功能,如压缩、解压缩、获取文件信息等。
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") #名字是mp3或者后缀名为.py的就不复制
shutil.copytree(src, dst, symlinks=False, ignore=None) # 拷贝目录(两句联合使用)
symlinks默认False将软连接拷贝为硬链接 否则拷贝为软连接
shutil.rmtree 删除目录 可以设置忽略文件
shutil.move(src, dst) 移动目录和文件
压缩与解压缩:
import shutil
# 压缩文件只支持zip和tar
#压缩, 文件名 格式 需要压缩的文件所在文件夹
shutil.make_archive("压缩测试","zip",r"/Users/jerry/PycharmProjects/备课/常用模块五期") #压缩后的文件放置在与被压缩文件相同的文件夹中
#解压缩 #压缩, 文件名 解压后的文件存放目录
shutil.unpack_archive("压缩测试.zip", #解压文件名
r"/Users/jerry/PycharmProjects/备课/常用模块五期",
r"zip")