Python将多个目录压缩成一个zip文件

时间:2017-09-14 23:53:44

标签: python zip archive

我有一个顶级目录ds237,其下面有多个子目录,如下所示:

ds237/ ├── dataset_description.json ├── derivatives ├── sub-01 ├── sub-02 ├── sub-03 ├── sub-04 ├── sub-05 ├── sub-06 ├── sub-07 ├── sub-08 ├── sub-09 ├── sub-10 ├── sub-11 ├── sub-12 ├── sub-13 ├── sub-21 ├── sub-22 ├── sub-23 ├── sub-24 ├── sub-25 ├── sub-26 ├── sub-27 ├── sub-28 ├── sub-29

我正在尝试根据zip文件的大小从ds237创建多个zip文件(具有正确的zip名称)。 sub01-01.zip: contain sub-01 to sub-07 sub08-13.zip : it contains sub08 to sub-13

我编写了一个逻辑,用于创建子目录列表[sub-01,sub-02, sub-03, sub-04, sub-05]。我创建了列表,以便列表中所有子目录的总大小不应该是> 5GB。

我的问题: 是如何编写一个函数来将这些子目录(在列表中)压缩到具有正确名称的目标zip文件中。 基本上我想写一个函数如下:

def zipit([list of subdirs], 'path/to/zipfile/sub*-*.zip'):

我的linux我通常通过以下方式实现: ' zip -r compress / sub01-08.zip ds237 / sub-0 [1-8]'

3 个答案:

答案 0 :(得分:8)

查看https://stackoverflow.com/a/1855118/375530,您可以重复使用该答案的功能将目录添加到ZipFile。

import os
import zipfile


def zipdir(path, ziph):
    # ziph is zipfile handle
    for root, dirs, files in os.walk(path):
        for file in files:
            ziph.write(os.path.join(root, file),
                       os.path.relpath(os.path.join(root, file),
                                       os.path.join(path, '..')))


def zipit(dir_list, zip_name):
    zipf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
    for dir in dir_list:
        zipdir(dir, zipf)
    zipf.close()

应使用预先分块列表和给定名称调用zipit函数。如果要使用程序化名称(例如"path/to/zipfile/sub{}-{}.zip".format(start, end)),则可以使用字符串格式。

答案 1 :(得分:1)

您可以使用subprocess来电' zip'并将路径作为参数传递

答案 2 :(得分:1)

以下内容将为您提供包含第一个文件夹ds100

的zip文件
import os
import zipfile    

def zipit(folders, zip_filename):
    zip_file = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED)

    for folder in folders:
        for dirpath, dirnames, filenames in os.walk(folder):
            for filename in filenames:
                zip_file.write(
                    os.path.join(dirpath, filename),
                    os.path.relpath(os.path.join(dirpath, filename), os.path.join(folders[0], '../..')))

    zip_file.close()


folders = [
    "/Users/aba/ds100/sub-01",
    "/Users/aba/ds100/sub-02",
    "/Users/aba/ds100/sub-03",
    "/Users/aba/ds100/sub-04",
    "/Users/aba/ds100/sub-05"]

zipit(folders, "/Users/aba/ds100/sub01-05.zip")

例如sub01-05.zip的结构类似于:

ds100
├── sub-01
|   ├── 1
|       ├── 2
|   ├── 1
|   ├── 2
├── sub-02
    ├── 1
        ├── 2
    ├── 1
    ├── 2