【问题标题】:Python: Zipping a Folder + FilePython:压缩文件夹+文件
【发布时间】:2023-03-18 21:26:01
【问题描述】:

我有一个这样的文件夹结构:C:\Users\Simon\Desktop\mySoftware\files\output\

在输出文件夹中,有一个文件和一个文件夹,里面有另一个文件。

我需要 Python 来压缩“输出”文件夹中的文件(和文件夹)。

我尝试了以下方法:

#!/usr/bin/env python
import os, zipfile

simonsFiles = 'C:\Users\Simon\Desktop\mySoftware\files\output\\'

simonsZip = zipfile.ZipFile("myzipfile.zip", "w")
for dirname, subdirs, files in os.walk(simonsFiles):
    simonsZip.write(dirname)
    for filename in files:
        simonsZip.write(os.path.join(dirname, filename))
simonsZip.close()

但 Python 会在其中创建一个包含整个结构的 zip 文件夹:

Users\Simon\Desktop\mySoftware\files\output\

当我输出时,它有我想要压缩到 zip 的文件夹和文件。

如何让 Python 将文件夹和文件压缩成一个 zip 而不是整个目录结构?

【问题讨论】:

  • 我猜,files 变量包括所有文件和文件夹。

标签: python compression zip zipfile


【解决方案1】:

您可能希望将第二个可选参数arcname 提供给zf.write() (http://docs.python.org/2/library/zipfile#zipfile.ZipFile.write)。 以下功能对我有用:

def zip_dir(zipname, dir_to_zip):
    dir_to_zip_len = len(dir_to_zip.rstrip(os.sep)) + 1
    with zipfile.ZipFile(zipname, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
        for dirname, subdirs, files in os.walk(dir_to_zip):
            for filename in files:
                path = os.path.join(dirname, filename)
                entry = path[dir_to_zip_len:]
                zf.write(path, entry)

此函数不会存档空子目录,要使其工作,您必须在第二个 for 循环中迭代文件+子目录。

【讨论】:

  • 刚刚尝试通过调用函数来运行它:'zip_dir(zip, pathname)' 其中路径名是路径的字符串。我收到以下错误: Traceback(最近一次调用最后一次):文件“zip.py”,第 23 行,在 zip_dir('file', spiesFiles) 文件“zip.py”,第 15 行,在 zip_dir spiesFiles = len(dir_to_zip.rstrip(os.sep)) + NameError: 全局名称 'dir_to_zip' 未定义
  • 嗯,dir_to_zip被定义为这个函数的参数,你复制代码的时候好像搞错了。
猜你喜欢
  • 2010-09-05
  • 2010-12-14
  • 2012-06-19
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多