Python zipfile 库 - 从一个目录创建一个仅包含 .pdf 和 .xml 文件的 zip

Posted

技术标签:

【中文标题】Python zipfile 库 - 从一个目录创建一个仅包含 .pdf 和 .xml 文件的 zip【英文标题】:Python zipfile library - create a zip with only .pdf and .xml files from one directory 【发布时间】:2019-10-02 11:33:25 【问题描述】:

我很想知道如何只压缩主目录中的所有 pdf,而不包括子文件夹。

我已经尝试过多次更改代码,但没有达到我想要实现的目标。

import zipfile

fantasy_zip = zipfile.ZipFile('/home/rob/Desktop/projects/zenjobv2/archivetest.zip', 'w')

for folder, subfolders, files in os.walk('/home/rob/Desktop/projects/zenjobv2/'):

    for file in files:
        if file.endswith('.pdf'):
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), '/home/rob/Desktop/projects/zenjobv2/'), compress_type = zipfile.ZIP_DEFLATED)
        elif file.endswith('.xml'):
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), '/home/rob/Desktop/projects/zenjobv2/'), compress_type = zipfile.ZIP_DEFLATED)
fantasy_zip.close()

我希望仅使用 zenjobv2 文件夹/目录中的 .pdfs 和 .xml 文件创建 zip,而不包括任何其他文件夹/子文件夹。

(已编辑)解决方案:

import os, glob
import zipfile

fantasy_zip = zipfile.ZipFile('/home/rob/Desktop/projects/zenjobv2/archivetest.zip', 'w')

root = "/home/rob/Desktop/projects/zenjobv2"

for file in os.listdir(root):
    if file.endswith('.pdf') or file.endswith(".xml"):
        fantasy_zip.write(file)
fantasy_zip.close()

【问题讨论】:

【参考方案1】:

更新了来自 OP 的新信息:

您正在使用os.walk() 遍历整个目录树。听起来您只想查看给定目录中的文件。为此,请考虑os.scandir(),它返回给定目录中所有文件和子目录的迭代器。您只需要过滤掉属于目录的元素:

root = "/home/rob/Desktop/projects/zenjobv2"
for entry in os.scandir(root):
    if entry.is_dir():
        continue  # Just in case there are strangely-named directories
    if entry.path.endswith(".pdf") or entry.path.endswith(".xml"):
        # Process the file at entry.path as you see fit

基于对问题理解不佳的先前答案:

您在对ZipFile.write() 的调用中隐式指定arcname argument,这将在存档中创建一个文件,其中包含您提供的路径、子目录和所有内容。如果您要添加到存档的文件位于路径 /home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf,那么使用 os.path.relpath() 的定义,您的代码将有效地转换为:

fantasy_zip.write("/home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf",
                  arcname="subdir1/subdir2/file.pdf",
                  compress_type=zipfile.ZIP_DEFLATED)

因为arcname 参数中包含目录分隔符,所以该文件将添加到名为subdir1/subdir2 的子目录中的存档中。

您可能打算改为这样做:

fantasy_zip.write(os.path.join(folder, file), arcname=file)

这会将目录结构排除在存档之外。但请注意,同名文件将被覆盖。

【讨论】:

谢谢,我会检查的。您是否知道如何仅在主目录中查找 .pdf 和 .xml 而不在 subdir1 和 subdir2 中查找 .pdf/.xml 文件。提前致谢。 您正在使用os.walk() 循环遍历子目录,这将遍历整个目录树。请考虑使用os.listdir()

以上是关于Python zipfile 库 - 从一个目录创建一个仅包含 .pdf 和 .xml 文件的 zip的主要内容,如果未能解决你的问题,请参考以下文章

14Python标准库系列之zipfile模块

如何检查 zip 文件是不是使用 python 的标准库 zipfile 加密?

Python学习第九篇:zipfile 库操作压缩包

Python学习第九篇:zipfile 库操作压缩包

Python学习第九篇:zipfile 库操作压缩包

Python 和 zipfile 模块