在Python中进行目录zip分卷压缩,可以使用标准库中的zipfile模块实现。具体步骤如下:

  1. 导入zipfile模块
import zipfile
  1. 创建ZipFile对象
zip_file = zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED)

这里创建了一个名为example.zip的ZipFile对象,以写入模式打开,使用ZIP_DEFLATED压缩算法。

  1. 遍历目录并添加文件到压缩包
import os

def add_to_zip(zip_file, path):
    if os.path.isfile(path):
        zip_file.write(path, os.path.basename(path))
    elif os.path.isdir(path):
        for root, dirs, files in os.walk(path):
            for file in files:
                file_path = os.path.join(root, file)
                zip_file.write(file_path, os.path.relpath(file_path, path))

add_to_zip(zip_file, '/path/to/folder')

这里定义了一个add_to_zip函数,用于遍历目录并添加文件到压缩包中。如果是文件,则直接写入压缩包;如果是目录,则使用os.walk遍历目录中的所有文件,并使用os.path.relpath获取相对路径,避免压缩包中出现嵌套的目录。

  1. 分卷压缩
MAX_SIZE = 1024 * 1024 * 100  # 100MB

def split_zip(zip_file):
    file_num = 1
    while True:
        current_size = 0
        current_zip_file = zipfile.ZipFile(f'example_{file_num}.zip', 'w', zipfile.ZIP_DEFLATED)
        for info in zip_file.infolist():
            if info.file_size > MAX_SIZE:
                raise ValueError(f'File {info.filename} is too large to be split.')
            if current_size + info.file_size > MAX_SIZE:
                current_zip_file.close()
                file_num += 1
                current_zip_file = zipfile.ZipFile(f'example_{file_num}.zip', 'w', zipfile.ZIP_DEFLATED)
                current_size = 0
            current_zip_file.writestr(info, zip_file.read(info.filename))
            current_size += info.file_size
        current_zip_file.close()
        if file_num == 1:
            os.remove('example.zip')
        if current_size == 0:
            break
        file_num += 1

这里定义了一个split_zip函数,用于分卷压缩。首先定义了一个常量MAX_SIZE,表示每个压缩包的最大大小。然后使用一个循环,不断遍历ZipFile对象中的文件,并将它们写入当前的压缩包中。如果当前压缩包大小超过了MAX_SIZE,则关闭当前压缩包,创建一个新的压缩包,并继续添加文件。最后如果只有一个压缩包,则删除原始压缩包。

  1. 最后记得关闭ZipFile对象
zip_file.close()

完整代码如下:

import os
import zipfile

MAX_SIZE = 1024 * 1024 * 100  # 100MB

def add_to_zip(zip_file, path):
    if os.path.isfile(path):
        zip_file.write(path, os.path.basename(path))
    elif os.path.isdir(path):
        for root, dirs, files in os.walk(path):
            for file in files:
                file_path = os.path.join(root, file)
                zip_file.write(file_path, os.path.relpath(file_path, path))

def split_zip(zip_file):
    file_num = 1
    while True:
        current_size = 0
        current_zip_file = zipfile.ZipFile(f'example_{file_num}.zip', 'w', zipfile.ZIP_DEFLATED)
        for info in zip_file.infolist():
            if info.file_size > MAX_SIZE:
                raise ValueError(f'File {info.filename} is too large to be split.')
            if current_size + info.file_size > MAX_SIZE:
                current_zip_file.close()
                file_num += 1
                current_zip_file = zipfile.ZipFile(f'example_{file_num}.zip', 'w', zipfile.ZIP_DEFLATED)
                current_size = 0
            current_zip_file.writestr(info, zip_file.read(info.filename))
            current_size += info.file_size
        current_zip_file.close()
        if file_num == 1:
            os.remove('example.zip')
        if current_size == 0:
            break
        file_num += 1

zip_file = zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED)
add_to_zip(zip_file, '/path/to/folder')
zip_file.close()
split_zip(zipfile.ZipFile('example.zip', 'r'))
python目录zip分卷压缩去除压缩目录嵌套

原文地址: https://www.cveoy.top/t/topic/bED4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录