如何修改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
相关产品推荐
相关产品推荐

