Python清理U盘:指定文件列表无法删除的技术问题
问题排查与修复
问题根源
你的代码在处理文件时,完全忽略了filenames_to_delete的匹配规则:
- 虽然循环时会检查
name in filenames_to_delete并进入处理块,但进入后针对文件的分支(os.path.isdir(path) is False)仅执行哈希校验逻辑,只有哈希匹配target_hash的文件才会被删除,完全没处理文件名匹配的删除需求。 - 目录部分的逻辑虽然有
name in filenames_to_delete的判断,但这部分是针对目录的,而你要删除的是文件,所以根本不会触发。
修复方案
修改文件处理分支的逻辑,添加文件名匹配的删除判断,同时保留原有的哈希校验逻辑:
import os import shutil import hashlib def delete_files_and_folders_on_usb_drive(usb_drive_path, filenames_to_delete, folder_prefixes, target_hash): for root, dirs, files in os.walk(usb_drive_path, topdown=False): for name in files + dirs: if (name in filenames_to_delete) or any(name.startswith(prefix) for prefix in folder_prefixes) or (name == '534') or (name.endswith('.exe')): path = os.path.join(root, name) try: if os.path.isdir(path): if name.endswith('.exe') and os.path.basename(os.path.dirname(path)) == os.path.splitext(name)[0]: with open(path, 'rb') as f: file_hash = hashlib.sha256(f.read()).hexdigest() if file_hash == target_hash: os.remove(path) else: if name.startswith('very important'): for dirpath, dirnames, filenames in os.walk(path): for dirname in dirnames: os.chmod(os.path.join(dirpath, dirname), 0o777) for filename in filenames: os.chmod(os.path.join(dirpath, filename), 0o777) if os.path.exists(path) and name in filenames_to_delete: os.remove(path) else: shutil.rmtree(path, ignore_errors=True) else: # 先处理文件名匹配的文件删除 if name in filenames_to_delete: print(f"Deleting target file: {path}") os.remove(path) else: # 仅对非目标文件名的文件执行哈希校验 with open(path, 'rb') as f: file_hash = hashlib.sha256(f.read()).hexdigest() if file_hash == target_hash: print(f"Deleting hash-matched file: {path}") os.remove(path) except Exception as e: print(f'Failure {path}: {e}') filenames_to_delete = ['Files.bat', 'MyText.txt'] folder_prefixes = ['new folder', 'very important', 'hackfolder'] target_hash = '9b57e6a137882be5a6e8c085cfa23f26294c2ac9427a99d0e54e9d26fc46c087' delete_files_and_folders_on_usb_drive('I:/', filenames_to_delete, folder_prefixes, target_hash)
额外优化建议
- 可以将文件和目录的判断逻辑拆分,避免在同一个循环里混合处理,减少逻辑混乱。
- 对于文件删除,建议先检查文件是否存在再执行删除(虽然
os.remove会报错,但可以提前判断避免不必要的异常)。
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

