如何按指定规则排序列表 确保无扩展名项在前适配shutil调用
优化实现方案
原有实现的核心隐患是依赖os.listdir的系统返回顺序,一旦遍历顺序先拿到zip文件,files_to_remove的顺序就会颠倒,直接导致shutil.rmtree调用报错。以下是符合要求的最优实现:
import os import time import shutil files = os.listdir(currentDir) # 过滤出需要删除的两个对象 files_to_remove = [ f for f in files if "." not in f or f == f"lecture{lecturenum}.zip" ] # 按规则强制排序:无扩展名项排在前,带扩展名项排在后 # 逻辑说明:'.' in x返回False对应0、True对应1,排序后值小的在前 files_to_remove.sort(key=lambda x: '.' in x) time.sleep(0.1) # 用os.path.join拼接路径避免分隔符兼容问题 shutil.rmtree(os.path.join(currentDir, files_to_remove[0])) os.remove(os.path.join(currentDir, files_to_remove[1]))
该方案的优势:
- 完全符合要求:不需要两次遍历,不需要额外判断路径是文件还是文件夹,仅通过文件名特征强制保证顺序,无论
os.listdir返回什么顺序,最终排序结果一定是[无扩展名项, 带扩展名zip项] - 过滤逻辑更严谨,不会出现原有写法中两个判断同时命中导致列表追加重复元素的问题
- 两个元素的排序几乎无性能损耗,比依赖遍历顺序的写法稳定性高很多
- 用标准库
os.path.join拼接路径,避免手动拼接漏写路径分隔符的跨系统兼容问题
内容的提问来源于stack exchange,提问作者Ben_Ex
相关产品推荐
相关产品推荐

