撤销zipfile.ZipFile写操作:误执行代码致文件损坏急求恢复方案
紧急求助:误运行错误代码致全磁盘文件损坏,求恢复方案
开发程序时嫌手动打包Zip麻烦,写了一段自动打包的代码,没测试就运行了,结果磁盘里所有文件全损坏了,现在没法开展工作。不管用什么编程语言,只要能解决问题就行。
导致损坏的错误代码
import zipfile import os import glob for file in glob.glob("**/*.*", recursive=True): print(file) with open(file, 'rb') as f: data = f.read() with zipfile.ZipFile(file, 'w') as zip_file: zip_file.writestr(file, data)
错误原因
这段代码的问题是:遍历到每个文件后,直接以w模式打开该文件作为Zip包写入,把原文件内容打包进这个Zip包,直接覆盖了原文件——说白了,你的所有文件现在其实都是包含原文件内容的Zip压缩包,只是扩展名没改,所以看起来像是损坏了。
恢复方案
1. 批量提取Zip包内的原始文件(最直接有效)
因为每个损坏文件本质是Zip包,里面存着你原来的文件内容,可以用代码批量提取:
import zipfile import os import glob # 先找个测试目录跑一遍,确认可行再全量处理 target_directory = "." # 替换成你要恢复的目录路径 for file_path in glob.glob(os.path.join(target_directory, "**/*.*"), recursive=True): try: # 尝试将文件作为Zip包打开 with zipfile.ZipFile(file_path, 'r') as zip_handle: # 获取Zip内存储的原文件条目(就是代码里写入的原文件路径) original_entry = zip_handle.namelist()[0] # 读取原文件内容 original_content = zip_handle.read(original_entry) # 先保存为带_restore后缀的备份文件,确认正常后再替换原文件 restore_path = f"{file_path}_restore" with open(restore_path, 'wb') as restore_file: restore_file.write(original_content) print(f"已恢复:{file_path} -> {restore_path}") except zipfile.BadZipFile: # 跳过本身不是Zip的文件(可能没被代码处理到) print(f"非损坏文件,跳过:{file_path}") except Exception as e: print(f"处理{file_path}失败:{str(e)}")
注意:先拿几个小文件测试,确认恢复后的文件正常,再批量处理所有文件。
2. 系统还原(最快)
如果你的系统开启了系统还原功能,直接还原到运行这段代码之前的系统还原点,就能一次性恢复所有文件。
3. 专业数据恢复工具(备选)
如果上述方法失效,立刻停止对该磁盘的任何写入操作,用Recuva、Disk Drill这类数据恢复软件扫描磁盘,它们可以通过文件签名识别并恢复被覆盖前的原始文件。
内容的提问来源于stack exchange,提问作者Junesuh Sung
相关产品推荐
相关产品推荐

