通过首先归档目录中的所有单个文件来创建目录归档 (Python)

Create archive of a directory by first archiving all individual files in it (Python)

我有一个目录 dir,其中包含 3 个文件:f1.txtf2.txtf3.pngt

我想创建一个 zip 存档 给定该目录的路径 其中 每个文件都是一个 zip归档。结果 zipped_archive.zip 应该与 dir 在同一路径上。

也就是说,我希望 zipped_archive.zip 包含 f1.zipf2.zipf3.zip,其中每个 f#.zip 文件都包含相应名称的txtpng 文件。

上面的内容可以用这个 文件结构:

更好地说明
tmp
 |
 +-- dir
 |    |
 |    +-- f1.txt
 |    +-- f2.txt
 |    +-- f3.txt
 |
 +-- zipped_archive.zip
 |          |
 |          +-- f1.zip
 |          |     |
 |          |     +-- f1.txt
 |          +-- f2.zip
 |          |     |
 |          |     +-- f2.txt
 |          +-- f3.zip
 |          |     |
 |          |     +-- f3.png

我已尝试应用 zipfile,如 this answer and shutil as seen this answer 中所示,两者都来自同一个问题。我虽然在每个文件上使用 shutil.make_archive,最后用那个结果做了 ziph.write,但我很难让它工作并且感到困惑。

有人可以 suggest/provide 一些示例代码来帮助我理解这是如何工作的吗?

试试这个。

import os
import zipfile

target = "dir"
os.chdir(target)  # change directory to target
files = os.listdir('.')  # get all filenames into a list

zipfiles = []  # a list which will be used later for containing zip files
for i in range(len(files)):
    fn = files[i].split('.')[0] + '.zip'  # f#.??? -> f#.zip
    zipf = zipfile.ZipFile(fn, 'w', zipfile.ZIP_DEFLATED)
    zipf.write(files[i])
    zipf.close()
    zipfiles.append(fn)  # put f#.zip into the list for later use

zipf = zipfile.ZipFile('../zipped_archive.zip', 'w', zipfile.ZIP_DEFLATED)
for i in range(len(zipfiles)):
    zipf.write(zipfiles[i])
    os.remove(zipfiles[i])  # delete f#.zip after archiving

zipf.close()
os.chdir('..')  # change directory to target's parent