按照网上通用的做法很快就实现了压缩功能,不过却发现传入绝对路径会把目录结构也给打包了进去,这对于脚本不是在压缩目标所在目录的情况是一件比较麻烦的事情。
解决方案
修改目录:os.chdir("/target_dir_path")
就是切换到需要打包的文件或者文件夹所在的目录,然后执行压缩即可,
不过考虑到切换了目录可能会影响到脚本的其它的功能,可以搭配os.getcwd()
把目录切换回来。
import os
import zipfile
target_dir = "/home/test"
to_file = "test.zip"
def pack_dir(target_dir, to_file):
root_dir = os.path.dirname(target_dir)
dir_name = os.path.basename(target_dir)
cur_dir = os.getcwd()
os.chdir(root_dir)
to_file_name = os.path.basename(to_file)
with zipfile.ZipFile(to_file_name, "w", zipfile.ZIP_DEFLATED) as f:
for root_dir, dir_list, file_list in os.walk(dir_name):
for name in file_list:
target_file = os.path.join(root_dir, name)
f.write(target_file)
os.chdir(cur_dir)
zip_file = os.path.join(root_dir, to_file_name)
return zip_file
# zipfile.ZipFile的压缩模式和压缩级别
# compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib),
# ZIP_BZIP2 (requires bz2) or ZIP_LZMA (requires lzma).
# compresslevel: None (default for the given compression type) or an integer
# specifying the level to pass to the compressor.
# When using ZIP_STORED or ZIP_LZMA this keyword has no effect.
# When using ZIP_DEFLATED integers 0 through 9 are accepted.
# When using ZIP_BZIP2 integers 1 through 9 are accepted.
不过这里还有问题就是,没办法把压缩的文件直接放到指定的目录里面,后续尝试用别的方法解决。
解决方案 Plus
不需要切换目录
压缩包内部目录可以指定
可以指定压缩包到指定位置
def pack_dir(target_dir, to_file):
target_dir_dir = os.path.dirname(target_dir)
dir_name = os.path.basename(target_dir)
cur_dir = os.getcwd()
to_file_name = os.path.basename(to_file)
# 手动打开文件句柄替换zipfile打开文件句柄
with open(to_file, "wb") as dest, zipfile.ZipFile(dest, "w", zipfile.ZIP_DEFLATED) as f:
for root_dir, dir_list, file_list in os.walk(target_dir):
for name in file_list:
target_file = os.path.join(root_dir, name)
arcname = target_file.replace(target_dir_dir, "") # 这里去掉绝对路径指定压缩包里面的文件所在目录结构
f.write(target_file, arcname=arcname)
return to_file