导入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 os
import zipfile
class ZipDir:
@staticmethod
def 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)
@classmethod
def 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")