如何用Python查找并删除磁盘损坏文件与文件夹,修复现有代码运行报错
报错原因
OSError: [Errno 5] Input/output error
该报错是触发了磁盘IO异常,对应路径的文件属于磁盘坏道关联文件、或文件系统元数据损坏,原有代码没有异常捕获逻辑,访问损坏文件时直接中断运行。
实现思路
- 对所有涉及磁盘读写的操作增加异常捕获,不因为单个文件损坏中断整个清理流程
- 异常捕获覆盖
os.path.getsize、os.listdir、os.remove、os.rmdir四个核心操作,所有触发OSError的路径统一标记为损坏待清理对象 - 保留倒序遍历文件夹删除的逻辑,避免父文件夹删除后子路径访问失效的问题
- 新增预览验证逻辑,先扫描所有待删除对象,确认后再执行删除操作,避免误删
可直接使用的代码
import os # 配置项 TARGET_PATH = "//run//media//halovivek//testing" # 预览模式设为True,仅打印待删除内容不执行实际删除;确认无误后改为False执行删除 DRY_RUN = True # 存储不同类型的待删除对象 to_delete_empty_files = [] to_delete_empty_dirs = [] to_delete_corrupted = [] # 第一步:扫描空文件和损坏文件 for root, dirs, files in os.walk(TARGET_PATH): for file in files: src_file = os.path.join(root, file) try: # 尝试读取文件大小,判断是否为空文件 if os.path.getsize(src_file) == 0: to_delete_empty_files.append(src_file) except OSError: # 触发IO错误说明文件损坏,加入损坏待删列表 to_delete_corrupted.append(src_file) # 第二步:扫描空文件夹和损坏文件夹 dir_list = [] for root, dirs, files in os.walk(TARGET_PATH): dir_list.append(root) # 倒序遍历文件夹 for root in dir_list[::-1]: try: # 尝试读取文件夹内容 dir_content = os.listdir(root) if not dir_content: to_delete_empty_dirs.append(root) except OSError: # 触发IO错误说明文件夹损坏,加入损坏待删列表 to_delete_corrupted.append(root) # 打印扫描结果 print("=== 扫描结果 ===") print(f"待删除空文件:{len(to_delete_empty_files)} 个") print(f"待删除空文件夹:{len(to_delete_empty_dirs)} 个") print(f"待删除损坏文件/文件夹:{len(to_delete_corrupted)} 个") if DRY_RUN: print("\n当前为预览模式,以下是待删除列表:") print("\n空文件:") for f in to_delete_empty_files: print(f) print("\n空文件夹:") for d in to_delete_empty_dirs: print(d) print("\n损坏文件/文件夹:") for c in to_delete_corrupted: print(c) else: # 执行删除操作 print("\n开始执行删除操作...") # 先删文件 for f in to_delete_empty_files + to_delete_corrupted: try: if os.path.isfile(f): os.remove(f) print(f"已删除文件:{f}") except Exception as e: print(f"删除文件失败 {f}:{str(e)}") # 再倒序删文件夹 for d in to_delete_empty_dirs[::-1] + to_delete_corrupted[::-1]: try: if os.path.isdir(d): os.rmdir(d) print(f"已删除文件夹:{d}") except Exception as e: print(f"删除文件夹失败 {d}:{str(e)}") print("删除操作执行完成")
使用注意事项
- 首次运行请保持
DRY_RUN = True,确认待删除列表无误后再修改为False执行实际删除 - 如果删除损坏文件时仍报错,可先对目标磁盘执行文件系统修复(Linux下执行
fsck命令,Windows下执行磁盘错误检查)后再运行代码 - 正在被系统或其他程序占用的文件也会触发访问异常,删除前请确认对应文件确实无保留必要
内容的提问来源于stack exchange,提问作者vivek rajagopalan
相关产品推荐
相关产品推荐

