python目录zip分卷压缩去除压缩目录嵌套
在Python中进行目录zip分卷压缩,可以使用标准库中的zipfile模块实现。具体步骤如下:
- 导入zipfile模块
import zipfile
- 创建ZipFile对象
zip_file = zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED)
这里创建了一个名为example.zip的ZipFile对象,以写入模式打开,使用ZIP_DEFLATED压缩算法。
- 遍历目录并添加文件到压缩包
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获取相对路径,避免压缩包中出现嵌套的目录。
- 分卷压缩
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,则关闭当前压缩包,创建一个新的压缩包,并继续添加文件。最后如果只有一个压缩包,则删除原始压缩包。
- 最后记得关闭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'))
原文地址: https://www.cveoy.top/t/topic/bED4 著作权归作者所有。请勿转载和采集!