导入os、zipfile模块
os模块中需要用到:os.walk函数
os.walk(top, topdown=True, onerror=None, followlinks=False)
参数解析:
- top是你要遍历的文件地址
- topdown为真,则优先遍历top目录,否则优先遍历top的子目录(默认为开启)
- onerror 需要一个 callable 对象,当walk需要异常时,会调用
- followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)
os.walk 的返回值:
返回值为生成器(generator),遍历获得所有的内容。每次遍历的对象都是返回的是一个三元组( root , dirs , files )
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
zipfile模块
# 打开压缩包zf = zipfile.ZipFile("ceshi1136.zip", "w", zipfile.ZIP_DEFLATED)# 压缩文件zf.write("路径","别名")# 解压文件zf = zipfile.ZipFile("ceshi1136.zip", "r")zf.extractall("路径") 解压所有文件到一个文件夹当中zf.extract("文件名","路径") 解压单个文件到一个文件夹当中# 关闭压缩包(解压、压缩文件之后记得调用该函数)zf.close()# 追加文件with zipfile.ZipFile("xxx.zip", "a", zipfile.ZIP_DEFLATED) as zf:# 在添加文件的时候,可以动态为该文件创建文件夹zf.write("/a/file", "/b/file")# 查看压缩包中的内容with zipfile.ZipFile("xxx.zip", "r") as zf:res = zf.namelist()print(res)
zipfile模块支持压缩成的格式:zip、rar、war、jar
单/批量压缩文件代码
import osimport zipfileclass ZipDir:@staticmethoddef zip_dir(path, zf):file_list = []# 是文件直接加入到需压缩文件路径的list中if os.path.isfile(path):file_list.append(path)# 遍历目录else:for root, dirs, files in os.walk(path, topdown=False):# 判断是否为空文件夹,需加上。不然递归的时候会过滤掉if not files and not dirs:file_list.append(root)for name in files:# 拼接文件路径file_list.append(os.path.join(root, name))for old_name in file_list:# arc_name为文件/文件夹压缩后的路径名(可改名字),一般原样压缩# 不包含根目录 如:testcase目录下有a、b两个文件;压缩后,在压缩文件根目录下显示两个文件# arc_name = old_name[len(path):]# 包含根目录 如:testcase目录下有a、b两个文件;压缩后,在压缩文件显示testcase目录# 上述如不太明白->可以运行代码看下压缩后的不同点arc_name = old_name[len(os.path.dirname(path)):]# 调用wirte方法压缩文件zf.write(old_name, arc_name)@classmethoddef zip_dirs(cls, dir_list, zip_name):"""批量压缩:param dir_list:多个压缩路径,可以是文件路径:param zip_name:压缩最终文件名称(路径+文件名.zip):return:"""# 打开压缩包zf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)for d in dir_list:cls.zip_dir(d, zf)zf.close()print("压缩完成->路径为:" + zip_name)if __name__ == '__main__':paths = ["路径1","路径2"]ZipDir.zip_dirs(paths, r"allfiles.rar")
