上周五回顾
logging
用于记录日志
四种核心角色:
生成器Logger
过滤器Filter
处理器Handler
格式化处理器 Formatter
logging.info.debug 使用默认配置
配置方式:
1.basicConfig
2.自己创建四种角色 并进行关联
3.用配置文件,字典来配置 logging.config
配置完后
用logging.config.dictConfig(loggin_config.LOGGING_DIC)
aaloger = loger.GetLogger('aa') #找得到配置就配置,找不到就用默认配置
shelve
open 打开文件 类似字典
用于序列化,序列化的中间格式,不能跨平台
sys
跟解释器的相关的操作
argv 获取调用解释器时传递的参数
path 添加环境变量
本周安排 day1 常用模块
1. os ***** 表示操作系统
该模块主要处理与操作系统相关的操作
最常用的是:文件操作
打开 读取 写入 删除 复制 重命名
os.getcwd() 获取当前执行文件所在的文件夹路径
os.chdir() 修改当前的工作目录,相当于命令行的cd
# 获取当前文件夹的字符串表现方式:.
os.curdir
# 获取父文件夹的字符串表现方式:..
os.pardir
os.makerdirs('a/b/c') # 可以创建多级目录,如果不存在,可以创建中间的目录
os.mkdir('c/b/a') # 只能创建单级目录,会把c和b当成已存在的路径
os.redir('a') # 删除文件夹必须保证文件夹是空的,才能删除
#如果要删除一个文件夹,而且文件夹不为空,思路是先遍历这个文件夹中的所有文件和文件夹
#要删除的文件路径
path=r'....acd.txt'
先把里面的文件全部删除,然后删除文件夹
for f in os.listdir('c'):
f_path = path+'\'+f
os.remove(f)
os.remove('c')
#注意遍历删除文件时,listdir得到的是文件名称,需要手动拼接完整路径
遍历删除文件夹内所有文件和文件夹
import os
def dele1(s):
if os.path.isdir(s):
for dir in os.listdir(s):
tmp_dir = os.path.join(s, dir)
print(tmp_dir)
if os.listdir(s) != []:
dele1(tmp_dir)
if os.path.isfile(tmp_dir):
os.remove(tmp_dir)
if os.listdir(s) == []:
os.rmdir(s)
dele1(r'/Users/authurchen/脱产5期内容/day19/代码/os模块/a')
print(os.stat(文件名)) # 获取文件信息
os.sep # 获取当前系统的路径分隔符,windows:\,linux:/,当你的程序要跨平台时,路径分隔符不能直接写死,要从os中获取
os.linesep # 返回当前平台的换行符
# 执行系统命令
os.system('dir')
os.environ # 获取系统的环境变量,跟解释器的sys.path不一样
# 什么时候使用os:当需要操作文件及文件夹的时候
# 重点放在文件的增删改查
2. os.path *****
path 该模块用于处理路径
之所以有这个模块,是因为python是跨平台的,各平台的路径书写方式不同,所有将所有与路径相关的都进行了封装
使用了path后,你的程序就是跨平台的,不会因为路径产生错误
os.path.abspath('__file__') # 把当前执行文件所在文件夹和后面文件做了拼接
os.path.split('绝对路径') # 将路径分隔为文件夹和文件名
os.path.basename('路径') # 获取路径中的文件名称
os.payh.dirname('路径') # 获取路径中的文件夹路径
os.path.exists('路径') # 判断一个文件路径是否存在,返回布尔值
os.path.isabs('路径') # 判断是否是绝对路径,依据是第一个字符是不是路径分隔符,是则表示绝对路径
os.path.isfile('路径') # 判断路径是否是一个文件,返回布尔值
os.path.isdir('路径') # 判断路径是否一个是文件夹,返回布尔值
#不是一个文件,必然是一个文件夹
os.path.join('路径1','路径2') # 以当前平台的路径分隔符来拼接路径
如果有多个开始的盘符",取的是最后一个
os.path.join('D:\','A:\','b')
os.path.getatime() #最后存取时间,返回时间戳
os.path.getmtime() # 返回时间戳,最后修改时间
os.path.getsize('文件路径') # 获取文件大小
os.path.normcase('路径') # 返回规范化路径,大写盘符转换成小写,根据当前操作系统做转换
os.path.normpath('路径') # 按当前平台修改路径分隔符的斜杠,并且会执行里面的..,....返回上级目录
总结:主要处理路径,不会关心路径是否存在,只是做拼接,剪切,转换等操作,通常与os模块一起使用
优点:用它处理的路径事可以跨平台的
3. subprocess ***
子进程
进程指的是一个正在运行的程序
子进程是由另一个正在运行的程序 例如qq聊天点击了一个链接,打开了浏览器,那么浏览器就称之为qq的子进程
为什么使用子进程?当我们有一个任务需要处理,而自己的程序无法处理,所有需要开启另一个程序
例如,在pyhton想要获取所有的进程列表信息(os.system('tasklist'))
#os.system 在执行系统指令时,也可以命令操作系统启动某个程序
问题:os.system在执行时有问题,直接把结果输出到控制台,如果想要获取执行的结果,就无能为力了
subprocess 不仅可以启动子进程,还能与子进程进行数据交互
import subprocess
#dir 表示要执行的命令
#shell 表示dir是一个命令
#stdout 指定输出管道
#管道是什么? 相当于生活中的水管,水可以通过管道从一个地方流到另一个地方
在程序中,数据相当于水,管道的作用,就是从一个进程中把数据传输到另一个进程,本质上是在读写同一个文件
p = subproxess.Popen('dir',shell=True,stdout=subprocess.PIPE)
print(p.stdout.read())
# 上面代码是启动了一个子进程,并将结果输出到制定管道
# 启动一个tasklist子进程,指定输出结果到管道中
p1 = subproxess.Popen('tasklist',shell=True,stdout=subprocess.PIPE)
# 启动一个findstr的子进程,将p1进程的结果,作为p2进程的输入
p2 = subproxess.Popen('findstr cmd', # 要执行的指令
shell=True, # 第一个参数是否是一个指令
stdin=p1.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE) # 表示错误管道,当进程执行出错时,可以在错误管道中获取结果
# 读取p2进程的结果
print(p2.stdout.read())
print(p2.stderr.read().decod('gbk'))
# 总结,当你需要在python中启动一个子进程,并且与它进行数据交互时,就使用subprocess,如果不需要数据交互,可以使用os.system
4. configparser ****
配置解析,用来解析配置文件的
何为配置文件?
用于编写程序的配置信息的文件
何为配置信息?
为了提高程序的扩展性,我们会把一些程序中需要用到的值交给用户来确定,比如迅雷的下载目录
配置文件的编写格式
只允许两种数据类型
section(分区),option(选项)
#这是一个section(分区)
[mysql]
#这是一个option(选项)
username = jack # 不用加引号,这里数据都是字符串
password = 123
# 注意:分区名称不能重复
# 同一个分区下,不能有重复option
configparser在read的时候,如果文件不存在,会自动创建文件
import configparser
# 创建一个配置文件解析器
cfg = configparser.ConfigParser()
# 读取名为test.cfg的配置文件
ctg.read('test.cfg'.encoding='utf-8')
#获取分区
print(cfg.sections())
# 获取某个分区下的某个选项,第一个参数分区名,第二个选项名称
username = cfg.get('mysql','username')
print(username)
password = cfg.get('mysql','password')
print(type(password)) # str类型
lock = cfg.getboolean('mysql','lock') # 帮忙转换数据类型
print(type(lock))
# 以下三个函数是帮你封装了类型转换
cfg.getfloat()
cfg.getint()
cfg.getboolean()
# 读取配置信息 两步
1.读取某个配置文件
2.调用get函数
config文件的增删改
#修改
cfg = configparser.ConfigParser()
cfg.read('test.cfg',encoding='utf-8')
#将mysql分区下的lock改为True
cfg,set('mysql','lock','true')
with open('test.config','wt',encoding='utf-8') as f:
cfg.write(f)
#增加新分区
cfg.add_section('新分区')
#增加新选项port,值为3306
cfg,set('mysql','port','3306')
with open('test.config','wt',encoding='utf-8') as f:
cfg.write(f)
# 删除分区
cfg.remove_section('新分区')
# 删除某分区的选项
cfg.remove_option('mysql','port')
# 作为配置文件,最常用的操作就是读取配置信息,很少会做修改
# 总结:read读取配置文件
add_section 添加分区
set 如果没有这个选项则添加,否则修改
remove_section 删除分区
remove_option 删除选项
cfg.has_section # 判断是否有分区
cfg.has_option # 判断是否有选项
5. shutil模块
shutil是一个工具包,封装了文件高级操作,让你操作起来更方便
功能看起来与os有些重叠,os只能帮你处理文件夹是否存在,路径是否正确,无法直接完成copy等操作
还提供了压缩与解压缩
shutil.ignore_patterns('mp3','*.py') # 忽略mp3和.py后缀文件
shutil.copytree() 拷贝目录
import shutil
shutil.copyfile('源文件路径','目标文件路径')
#压缩文件 支持的格式zip和tar
shutil.make_archive('要压缩的文件名','zip','压缩文件放到的路径名')
make_archive中的第四个参数base_dir也是用来指定压缩的路径,与root_dir的区别
#root_dir仅压缩指定路径下的内容
#base_dir 压缩时,会将指定的路径下的内容,与其完整的文件层级一并压缩
#当指定base_dir时,root_dir不生效
shutil.make_archieve('test','zip',root_dir='day20')
shutil.make_archieve('test','zip',root_dir='day20',base_dir='day20')
#解压文件
shutil.unpack_archive('解压的文件路径','解压到的路径名','zip')
shutil实际上调用了zipfile,tarfile模块
import zipfile
import tarfile
# 总结:shutil模块 copy文件 压缩文件时使用
day2 ATM+购物车 day3 面向对象基础 day4 面向对象进阶 day5 面向对象高级