在Python中复制ZIP文件到另一个文件可以通过多种方式实现,以下是几种常见的方法:
一、使用 shutil.copyfileobj
复制单个ZIP文件
shutil.copyfileobj
可以直接复制文件对象,适用于复制单个ZIP文件。
import shutil
# 源ZIP文件路径
src_zip = 'source.zip'
# 目标ZIP文件路径
dst_zip = 'destination.zip'
# 打开源ZIP文件和目标ZIP文件
with open(src_zip, 'rb') as src_file, open(dst_zip, 'wb') as dst_file:
shutil.copyfileobj(src_file, dst_file)
二、使用 zipfile
模块解包后复制文件
zipfile
模块允许你解包ZIP文件到临时目录,然后再复制到目标位置。
import zipfile
import shutil
import tempfile
# 源ZIP文件路径
src_zip = 'source.zip'
# 目标目录路径
dst_dir = 'destination_folder'
# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:
# 解包ZIP文件到临时目录
with zipfile.ZipFile(src_zip, 'r') as zip_ref:
zip_ref.extractall(temp_dir)
# 遍历临时目录中的文件并复制到目标目录
for root, dirs, files in os.walk(temp_dir):
for file in files:
shutil.copy(os.path.join(root, file), dst_dir)
三、使用 shutil.make_archive
批量处理
如果需要复制多个ZIP文件,可以使用 shutil.make_archive
批量创建ZIP文件,但此方法不直接支持复制现有ZIP文件。
四、使用 pathlib
和 os
模块递归处理子目录
适用于需要递归处理子目录中的文件并打包成新ZIP文件。
import zipfile
import os
from pathlib import Path
def zip_folder(src_folder, dst_zip):
with zipfile.ZipFile(dst_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(src_folder):
for file in files:
src_path = os.path.join(root, file)
dst_path = os.path.join(dst_zip, os.path.relpath(src_path, src_folder))
zipf.write(src_path, dst_path)
# 示例调用
src_folder = 'source_directory'
dst_zip = 'destination.zip'
zip_folder(src_folder, dst_zip)
注意事项
-
权限问题 :确保目标目录存在且可写。
-
大文件处理 :对于大文件,建议使用
with
语句管理文件上下文,避免资源泄漏。 -
密码保护 :部分ZIP文件可能加密,解包时需提供密码。
通过以上方法,你可以灵活地复制ZIP文件到目标位置,根据需求选择适合的方案。