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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:45:01