当自动化测试执行完测试用例后,生成的测试用例报告(Html、Allure等)一般会放在某个目录中,如果想把测试报告通过邮件的方式自动发送给其他人,这时候前提是需要把该目录下的测试报告们打包压缩,然后再邮件发送。
目录
一、“.zip”压缩文件类型
下载
二、zipfile日常使用
1、ZipFile 对象
2、zipfile读取
3、zipfile写入
三、zipfile文件压缩封装
总结
在我们使用zipfile时,zipfile处理的压缩文件后缀名可是“.zip”,“.zip”对应的是winzip软件,在我们使用zipfile进行压缩操作后,也需要相应的软件进行检验查阅操作,下边介绍winzip软件。
zip格式比较常见支技泛围广,windows操作系统不装任何第三方软件也可以打开zip格式
winzip是付费软件,使用界面如下:
个人用的比较多的是7zip,其实winzip之前几乎没有接触过,在了解python压缩库的时候才把winzip下载了,因为zipfile库需要用到winzip,其实两个压缩软件使用体验差不太多,winzip可能更加专业化,不过需要付费。
winzip下载地址:WinZip Windows 版 - 压缩文件、解压缩文件
简单来说zipfile模块用来做zip格式编码的压缩和解压缩的,ZipFile是主要的类,用来创建和读取zip文件。
class zipfile.ZipFile
(file, mode='r', compression=ZIP_STORED)
zipfile要进行相关操作,首先实例化一个 ZipFile 对象,我选取了最为常用的三个参数,“file”是必选参数,指字符串格式压缩包名称(也可指定路径);“mode”是可选参数,表示打开模式/类似文件操作,有r、w、a三种模式,分别表示读、写、添加操作;
“compression”是可选参数,指在写入压缩文件时使用的 ZIP 压缩方法,目的是模仿各压缩方法的数字常数,不过最终读取或创建的都是zip压缩算法下的文件。(本人试验过,不论哪种compression,创建新的压缩文件依然是“.zip”操作)
zipfile.py模块:
比如要读取一个zip压缩包,这里假设filename是该压缩包的路径,z.namelist() 会返回压缩包内所有文件名的列表,for循环打印出列表的值,也就是文件名。
import zipfile
zipf = zipfile.ZipFile(filename, 'r')
# 这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件
for f in zipf.namelist():
print(f)
z.infolist()返回的是压缩包内所有文件的信息(单目录),是一个ZipInfo的列表,里边包含了多个ZipInfo对象,每个对象包含了压缩文件的信息,filename, file_size, header_offset, 分别为文件名,文件大小,文件数据在压缩包中的偏移。
import zipfile
zipf = zipfile.ZipFile(filename, 'r')
for i in zipf.infolist():
print(i.filename,i.file_size)#打印文件名和大小
读:从压缩包里解压出一个文件的方法是使用ZipFile的read方法,这样读取出z.namelist()中的第一个文件,并且输出到屏幕,也支持pwd参数(压缩文件密码)。
import zipfile
zipf = zipfile.ZipFile(filename, 'r')
print zipf.read(zipf.namelist()[0],pwd=None)
提取:zipf.extract()和zipf.extractall()分别是提取压缩包里的某个文件或所以文件,path是指定的解压出的目录路径,也支持pwd参数(压缩文件密码)。
zipf =zipfile.ZipFile(r'C:\Users\xiaowo\Desktop\xx1.zip', 'r')
# 这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件
zipf.extract(zipf.namelist()[0], path=None, pwd=None) #提取压缩包里的某个压缩文件
zipf.extractall(path=None, pwd=None) #提取压缩包里的所以压缩文件
写入需要用到ZipFile.write(filename, arcname=None, compress_type=None)函数,filename是必选参数,指文件名/路径,arcname指的是写入的压缩包里的文件的名称,默认情况下与filename一致。
import zipfile, os
z = zipfile.ZipFile(filename, 'w')
# 注意这里的第二个参数是w,这里的filename是压缩包的名字
if os.path.isdir(testdir): #判断testdir路径是否是目录
for d in os.listdir(testdir): #返回指定的文件夹包含的文件或文件夹的名字的列表。
z.write(testdir+os.sep+d)
z.close()
1.导入zipfile、re库,定义make_zip函数,也就是zip打包压缩
2.实例化一个ZipFile 对象,注意mode是’w‘,表示写入
3.遍历指定文件夹里的文件,对其依次进行写入操作,循环结束后关闭ZipFile 对象
import zipfile,re
def make_zip(localPath,pname): #localPath:待压缩的文件包路径,pname:写入新的压缩文件名(创建在当前py文件目录下),也可指定具体路径
'''打包zip'''
if re.search('.zip',pname): #re.search整个pname字符串,返回一个成功的匹配 #因为新的压缩文件带.zip才能正常使用,不然需要人为添加
pass #提升函数灵活性,调用函数时,pname携带或不携带“.zip”均可
else:
pname = pname +'.zip'
zipf = zipfile.ZipFile(pname,'w',zipfile.ZIP_DEFLATED) #实例化zipfile对象,表示一个zip文件,pname时文件名(创建在当前py文件目录下)
if os.path.isdir(localPath): # 判断testdir路径是否是目录
for d in os.listdir(localPath): # 返回指定的文件夹包含的文件或文件夹的名字的列表。
z.write(localPath + os.sep + d)
z.close()
return pname
大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。