Python:压缩目录中的所有文件夹

3
如果我知道目录的路径,如何将其中的每个文件夹分别压缩成zip文件?我尝试了一些方法,但由于我不完全了解os模块的工作方式,所以无能为力。
import os, zipfile

directory_path = str(raw_input())
for folder in os.listdir(directory_path):
    zip_file = zipfile.ZipFile(folder + '.zip', 'w')
    for root, dirs, files in os.walk(directory_path+'/'+folder):
        for file in files:
            zip_file.write(os.path.join(root, file),file)
    zip_file.close()

问题在于它只压缩目录中的一个文件夹。
例子:
Directory
 |
 +-- folder1
 |  |  
 |  \-- file 1.1
 |
 +-- folder2
 |  |  
 |  \-- file 2.1
 |    
 +-- folder3
 |  |  
 |  +-- file 3.1
 |  \-- file 3.2

我需要的是文件夹1.zip(包含文件1.1),文件夹2.zip(包含文件2.1)和文件夹3.zip(包含文件3.1和文件3.2)。非常感谢您的帮助。

你能提供一个输入目录和期望的输出示例吗? - Daniele Pantaleone
@DanielePantaleone 我添加了一个例子,希望这就是你想要的。 - user5515662
@shomz 谢谢!我还有点困惑,因为您目前的代码似乎正是您想要的。例如,对我来说,folder1.zip 很好地包含了 file1.1 - phihag
@phihag for循环是否遍历目录中的每个文件夹? 因为我只得到了folder1.zip,但没有得到folder2.zip和folder3.zip。 - user5515662
@shomz,我的测试中也得到了folder2.zipfolder3.zip,我认为循环没有问题。 - phihag
显示剩余6条评论
1个回答

5

我认为问题在于您为zip档案中的每个文件指定了不同的arcname(即write方法的第二个参数)。请尝试以下操作(我还替换了一些代码,例如使用os.path模块而不是字符串连接的路径合并):

import os
import zipfile

path = raw_input('Enter the directory: ')
path = os.path.abspath(os.path.normpath(os.path.expanduser(path)))
for folder in os.listdir(path):
    zipf = zipfile.ZipFile('{0}.zip'.format(os.path.join(path, folder)), 'w', zipfile.ZIP_DEFLATED)
    for root, dirs, files in os.walk(os.path.join(path, folder)):
        for filename in files:
            zipf.write(os.path.abspath(os.path.join(root, filename)), arcname=filename)
    zipf.close()

这个程序按照我想要的方式将每个文件单独压缩,但它包含了路径中的每个文件夹,而不仅仅是文件。 - user5515662
请问您能否再清楚一些?您的意思是folder1.zip文件中包含了文件夹folder1及其中的所有文件,而不仅仅是文件本身吗? - Daniele Pantaleone
我的意思是,如果路径是 /Users/shomz/Documents/directory,那么 folder1.zip 包含一个名为 users 的文件夹,然后在其中是 shomz,然后是 directory,最后是我需要的文件夹。 - user5515662
好的,现在我明白问题了:)。我编辑了答案。问题确实在arcname中。有关更多信息,请参见此 SO 问题:https://dev59.com/sWw05IYBdhLWcg3w0VGa - Daniele Pantaleone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接