20181210(os,os.path,subprocess,configparser,shutil)

 

1、os模块

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")

 

 

 

 

 

posted @ 2018-12-10 18:49  real-admin  阅读(198)  评论(0)    收藏  举报