Python 将多个目录压缩到一个 zip 文件中
Python zip multiple directories into one zip file
我有一个顶级目录 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]'
您可以使用 subprocess 调用 'zip' 并将路径作为参数传递
查看 ,您可以重复使用该答案的功能将目录添加到 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)
),您可以使用字符串格式。
以下将为您提供带有第一个文件夹的 zip 文件 ds100
:
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
我有一个顶级目录 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]'
您可以使用 subprocess 调用 'zip' 并将路径作为参数传递
查看 ,您可以重复使用该答案的功能将目录添加到 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)
),您可以使用字符串格式。
以下将为您提供带有第一个文件夹的 zip 文件 ds100
:
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