Python,zipfile模块压缩,目录问题记录

17 篇文章 2 订阅

按照网上通用的做法很快就实现了压缩功能,不过却发现传入绝对路径会把目录结构也给打包了进去,这对于脚本不是在压缩目标所在目录的情况是一件比较麻烦的事情。

解决方案

修改目录: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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值