导入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模块

  1. # 打开压缩包
  2. zf = zipfile.ZipFile("ceshi1136.zip", "w", zipfile.ZIP_DEFLATED)
  3. # 压缩文件
  4. zf.write("路径","别名")
  5. # 解压文件
  6. zf = zipfile.ZipFile("ceshi1136.zip", "r")
  7. zf.extractall("路径") 解压所有文件到一个文件夹当中
  8. zf.extract("文件名","路径") 解压单个文件到一个文件夹当中
  9. # 关闭压缩包(解压、压缩文件之后记得调用该函数)
  10. zf.close()
  11. # 追加文件
  12. with zipfile.ZipFile("xxx.zip", "a", zipfile.ZIP_DEFLATED) as zf:
  13. # 在添加文件的时候,可以动态为该文件创建文件夹
  14. zf.write("/a/file", "/b/file")
  15. # 查看压缩包中的内容
  16. with zipfile.ZipFile("xxx.zip", "r") as zf:
  17. res = zf.namelist()
  18. print(res)

zipfile模块支持压缩成的格式:zip、rar、war、jar


若要压缩成tar文件:需用tarfile模块

单/批量压缩文件代码

  1. import os
  2. import zipfile
  3. class ZipDir:
  4. @staticmethod
  5. def zip_dir(path, zf):
  6. file_list = []
  7. # 是文件直接加入到需压缩文件路径的list中
  8. if os.path.isfile(path):
  9. file_list.append(path)
  10. # 遍历目录
  11. else:
  12. for root, dirs, files in os.walk(path, topdown=False):
  13. # 判断是否为空文件夹,需加上。不然递归的时候会过滤掉
  14. if not files and not dirs:
  15. file_list.append(root)
  16. for name in files:
  17. # 拼接文件路径
  18. file_list.append(os.path.join(root, name))
  19. for old_name in file_list:
  20. # arc_name为文件/文件夹压缩后的路径名(可改名字),一般原样压缩
  21. # 不包含根目录 如:testcase目录下有a、b两个文件;压缩后,在压缩文件根目录下显示两个文件
  22. # arc_name = old_name[len(path):]
  23. # 包含根目录 如:testcase目录下有a、b两个文件;压缩后,在压缩文件显示testcase目录
  24. # 上述如不太明白->可以运行代码看下压缩后的不同点
  25. arc_name = old_name[len(os.path.dirname(path)):]
  26. # 调用wirte方法压缩文件
  27. zf.write(old_name, arc_name)
  28. @classmethod
  29. def zip_dirs(cls, dir_list, zip_name):
  30. """
  31. 批量压缩
  32. :param dir_list:多个压缩路径,可以是文件路径
  33. :param zip_name:压缩最终文件名称(路径+文件名.zip)
  34. :return:
  35. """
  36. # 打开压缩包
  37. zf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
  38. for d in dir_list:
  39. cls.zip_dir(d, zf)
  40. zf.close()
  41. print("压缩完成->路径为:" + zip_name)
  42. if __name__ == '__main__':
  43. paths = ["路径1","路径2"]
  44. ZipDir.zip_dirs(paths, r"allfiles.rar")