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的主要内容,如果未能解决你的问题,请参考以下文章