You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解压Zip文件时同名文件被覆盖问题求解决方案

解决Zip解压时同名文件覆盖的问题

你的代码直接将所有Zip包内容解压到同一目录,自然会出现同名文件被后续解压包覆盖的情况,下面提供两种实用解决方案:

方案一:为每个Zip包创建独立子目录

把每个Zip包的内容解压到以该Zip文件名命名的子文件夹中,从根源避免文件冲突。

修正后的代码:

import os
import zipfile

extension = ".zip"
dir_name = "./your_target_directory"  # 替换成你的目标目录路径

for item in os.listdir(dir_name):
    if item.endswith(extension):
        # 获取Zip文件的完整路径
        zip_full_path = os.path.join(dir_name, item)
        # 生成子目录名(去掉Zip后缀)
        sub_dir = os.path.join(dir_name, os.path.splitext(item)[0])
        # 自动创建子目录,已存在则跳过
        os.makedirs(sub_dir, exist_ok=True)
        
        # 用with语句自动管理Zip文件的打开/关闭
        with zipfile.ZipFile(zip_full_path, 'r') as zip_ref:
            zip_ref.extractall(sub_dir)
        
        # 可选:删除原Zip文件
        os.remove(zip_full_path)

方案二:重命名重复文件(无额外子目录)

如果希望所有文件都放在同一目录下,可检测重复文件名并自动添加序号后缀(如File 1.txt→File 1_1.txt)。

修正后的代码:

import os
import zipfile

extension = ".zip"
dir_name = "./your_target_directory"

def get_unique_file_path(target_dir, original_name):
    """生成不重复的文件路径,重复则添加序号"""
    base_name, file_ext = os.path.splitext(original_name)
    counter = 1
    target_path = os.path.join(target_dir, original_name)
    while os.path.exists(target_path):
        target_path = os.path.join(target_dir, f"{base_name}_{counter}{file_ext}")
        counter += 1
    return target_path

for item in os.listdir(dir_name):
    if item.endswith(extension):
        zip_full_path = os.path.join(dir_name, item)
        with zipfile.ZipFile(zip_full_path, 'r') as zip_ref:
            # 遍历Zip内的每个文件
            for file_info in zip_ref.infolist():
                # 跳过目录,只处理文件
                if file_info.is_dir():
                    continue
                # 获取原始文件名
                original_file_name = file_info.filename
                # 生成唯一保存路径
                save_path = get_unique_file_path(dir_name, original_file_name)
                # 读取并写入文件
                with open(save_path, 'wb') as output_file:
                    output_file.write(zip_ref.read(original_file_name))
        
        # 可选:删除原Zip文件
        os.remove(zip_full_path)

方案选择建议

  • 若需要保留每个Zip包的独立文件结构,优先选方案一;
  • 若希望所有文件集中存放且不覆盖,选方案二。

内容的提问来源于stack exchange,提问作者TechGamer Expert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:25:39