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

如何修改Python ZipFile脚本以同时排除__MACOSX和.DS_Store?

解决压缩包排除指定项并提取目标目录名的问题

问题场景

假设压缩包acme_example.zip包含以下内容:

acme/one.txt
acme/one1.txt
acme/one2.txt
acme/one3.txt
acme/one4.txt
__MACOSX
.DS_Store

现有脚本仅能排除__MACOSX,需要修改使其同时排除.DS_Store,最终仅返回acme作为结果:

output_var = []
skip_st = '__MACOSX'
with ZipFile('acme_example.zip','r') as ZipObj:
    listfFiles = ZipObj.namelist()
    for elm in listfFiles:
        p = Path(elm).parts[0]
        if p not in output_var:
            output_var.append(p)
    return re.sub(skip_st, '', ''.join(str(item) for item in output_var))

修改方案

直接调整排除逻辑,将单个排除字符串改为集合,并在收集目录名时直接过滤掉不需要的项,具体修改如下:

修改后的完整代码

from zipfile import ZipFile
from pathlib import Path

def get_target_folder():
    output_var = []
    # 定义需要排除的文件夹/文件名集合,方便后续扩展
    skip_items = {'__MACOSX', '.DS_Store'}
    with ZipFile('acme_example.zip','r') as ZipObj:
        listfFiles = ZipObj.namelist()
        for elm in listfFiles:
            top_part = Path(elm).parts[0]
            # 仅保留不在排除集合中且未重复的项
            if top_part not in skip_items and top_part not in output_var:
                output_var.append(top_part)
    # 返回目标文件夹名(若确定唯一,可直接返回output_var[0])
    return ''.join(output_var)

关键修改点

  • 将单个排除字符串改为集合类型的排除列表,既支持同时排除__MACOSX和.DS_Store,后续添加新的排除项也更方便。
  • 在循环遍历文件列表时,直接判断当前顶级目录/文件是否属于排除项,不符合条件的直接跳过,避免了后续用正则替换的冗余操作,逻辑更清晰。
  • 移除了re.sub操作,因为现在output_var中只会包含需要保留的目录名,直接拼接即可得到结果。

内容的提问来源于stack exchange,提问作者hare krshn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:37:12