【问题标题】:Zipping files from a set using zipfile使用 zipfile 从集合中压缩文件
【发布时间】:2019-05-30 10:18:29
【问题描述】:

我需要一起压缩路径上的特定文件。 我需要找到某些文件(例如:AAA.txt、BBB.inf 等),但名称中包含 SFF 的文件除外,然后将它们全部压缩在一起。

每次我运行它时,我都会得到我的DB.zip,里面只有CCC.txt。这意味着每次脚本从集合中找到一个文件时,它都会创建一个新的DB.zip,其中包含该新文件,覆盖之前的文件。我该如何解决这个问题?

import os
import zipfile

pr_directory = r'C:\Users\vijo9001\Desktop\Infact'
pr_path = os.listdir(pr_directory)
dst = r'C:\Users\vijo9001\Desktop\Infact'
os.chdir(r'C:\Users\vijo9001\Desktop\Infact')

my_set = {
"AAA",
"BBB",
"CCC"
}

for file in pr_path:
    zip_file = pr_directory + '/' + 'DB.zip'
    for x in my_set:
        if 'SFF' in file:
            continue
        if (str(x)) in file:
           zip = zipfile.ZipFile(zip_file, "w",)
           zip.write(file, compress_type=zipfile.ZIP_DEFLATED)
           zip.close()

【问题讨论】:

  • 您的代码是否有具体问题或问题?或者您正在寻找代码审查?
  • 它根本不起作用。我期待一个评论左右......

标签: python windows file


【解决方案1】:

我发现您的代码有几处您可能想要优化/更正:

  1. zip 在每次迭代中通过 for 循环实例化,相互覆盖。 这意味着您将为文件“AAA1.txt”生成一个 DB.zip 文件,然后用仅包含文件“AAA2.txt”的 DB.zip 覆盖它,依此类推。通过在 for 循环之前启动 zip,您将依次添加每个文件,生成包含所有文件的单个 DB.zip。
  2. 您可以使用带有以下条件的简单 if 语句,而不是为 my_set 中的每个元素使用 for 循环:if any(x in file_split for x in my_set)
  3. zip_file 只需要在 for 循环之前移动即可正确声明 zip
  4. zip 隐藏 zip 库,为了更清晰和避免错误,最好重命名变量(我在下面的代码中使用了 zip_dir)

我对您的代码进行了一些尝试,并提出了以下 sn-p:

my_set = {"AAA", "BBB", "CCC"}

zip_file = pr_directory + '/' + 'DB.zip'
zip_dir = zipfile.ZipFile(zip_file, "w",)

for file in pr_path:
    if 'SFF' in file:
        continue
    if any(x in file for x in my_set):
        zip_dir.write(file, compress_type=zipfile.ZIP_DEFLATED)

zip_dir.close()

这对我来说似乎很好用。希望我能有所帮助。

【讨论】:

  • 太完美了!感谢您抽出时间向我解释,这真的很有价值,因为我在 Python 编码的第二周 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多