【测试开发】Python—zipfile库文件压缩封装

当自动化测试执行完测试用例后,生成的测试用例报告(Html、Allure等)一般会放在某个目录中,如果想把测试报告通过邮件的方式自动发送给其他人,这时候前提是需要把该目录下的测试报告们打包压缩,然后再邮件发送。

目录

一、“.zip”压缩文件类型

下载

二、zipfile日常使用

1、ZipFile 对象

2、zipfile读取

3、zipfile写入

三、zipfile文件压缩封装

总结


一、“.zip”压缩文件类型

在我们使用zipfile时,zipfile处理的压缩文件后缀名可是“.zip”,“.zip”对应的是winzip软件,在我们使用zipfile进行压缩操作后,也需要相应的软件进行检验查阅操作,下边介绍winzip软件。

zip格式比较常见支技泛围广,windows操作系统不装任何第三方软件也可以打开zip格式

winzip是付费软件,使用界面如下:

【测试开发】Python—zipfile库文件压缩封装_第1张图片

个人用的比较多的是7zip,其实winzip之前几乎没有接触过,在了解python压缩库的时候才把winzip下载了,因为zipfile库需要用到winzip,其实两个压缩软件使用体验差不太多,winzip可能更加专业化,不过需要付费。

下载

winzip下载地址:WinZip Windows 版 - 压缩文件、解压缩文件

二、zipfile日常使用

简单来说zipfile模块用来做zip格式编码的压缩和解压缩的,ZipFile是主要的类,用来创建和读取zip文件。

1、ZipFile 对象

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED)

zipfile要进行相关操作,首先实例化一个 ZipFile 对象,我选取了最为常用的三个参数,“file”是必选参数,指字符串格式压缩包名称(也可指定路径);“mode”是可选参数,表示打开模式/类似文件操作,有r、w、a三种模式,分别表示读、写、添加操作;

“compression”是可选参数,指在写入压缩文件时使用的 ZIP 压缩方法,目的是模仿各压缩方法的数字常数,不过最终读取或创建的都是zip压缩算法下的文件。(本人试验过,不论哪种compression,创建新的压缩文件依然是“.zip”操作)

【测试开发】Python—zipfile库文件压缩封装_第2张图片

zipfile.py模块:

 【测试开发】Python—zipfile库文件压缩封装_第3张图片

2、zipfile读取

比如要读取一个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) #提取压缩包里的所以压缩文件

3、zipfile写入

写入需要用到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() 

三、zipfile文件压缩封装

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

总结

大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。

你可能感兴趣的:(测试开发,python,测试工具)