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

Posted

技术标签:

【中文标题】Python:压缩目录中的所有文件夹【英文标题】:Python: zip all folders in directory 【发布时间】:2015-12-08 10:11:23 【问题描述】:

如果我知道目录的路径,如何单独压缩其中的所有文件夹?我尝试了一些东西,但由于我不完全了解 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

我想要得到的是folder1.zip(包含文件1.1)、folder2.zip(包含文件2.1)和folder2.zip(包含文件3.1和文件3.2

感谢任何帮助。

【问题讨论】:

您的代码对我来说看起来不错。您提供的目录中是否有多个文件夹?使用zip_file.write(os.path.join(root, file),file) 防止创建额外的目录。 @Mahesh 我确实有多个文件夹。谢谢,它现在可以正确压缩,但它仍然只压缩目录中的一个文件夹。 您能否提供输入目录和所需输出的示例? @DanielePantaleone 我添加了一个例子,希望这就是你的意思。 你能提供r正则表达式的定义吗? 【参考方案1】:

我认为问题在于您为 zip 存档中的每个文件指定了不同的 arcnamewrite 方法的第二个参数)。尝试以下操作(我还替换了一些代码,例如使用 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()

【讨论】:

这会根据我的需要单独压缩每个文件,但它包含路径中的每个文件夹,而不仅仅是文件。 您能说得清楚一点吗?你的意思是folder1.zip 包含目录folder1,其中包含所有文件,而不仅仅是文件? 我的意思是,如果路径是/Users/shomz/Documents/directory,那么folder1.zip包含一个文件夹users,然后在其中shomz,然后是目录和then i> 我需要的文件夹。 好的,现在我明白了这个问题:)。我编辑了答案。问题确实出在 arcname 中。有关更多信息,请查看此 SO 问题:***.com/q/7007868/3477005

以上是关于Python:压缩目录中的所有文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Python用动态名称压缩文件

使用 tarfile (Python) 仅压缩给定目录中的文件

使用tarfile(Python)仅压缩给定目录中的文件

如何在bash中将所有子目录中的所有文件gzip到一个压缩文件中

如何使用 tar 压缩当前目录中的所有文件,但不输入 tar 文件和所有文件的名称?

将目录中的所有文件压缩到单独的归档文件中