Python循环验证密码解密加密Excel文件的问题求助
问题修正方案
你的代码存在逻辑顺序错误、拼写错误以及IO流处理问题,以下是修正后的实现:
原代码核心问题
- 逻辑顺序颠倒:应该先尝试加载密码
load_key,验证成功后再执行解密decrypt,原代码先解密再加载密码,完全不符合流程 try-except块位置错误:需要把验证密码、解密的操作放在异常捕获块内,才能正确捕获密码错误的异常- 拼写错误:
Entre→Enter,flie→file,decrpyted→decrypted,Invaild→Invalid - 解密后的
BytesIO对象读取前需要重置指针,否则pd.read_excel会读取空内容
修正后的代码
import io import pandas as pd import msoffcrypto # 替换为你的目标文件路径 file_path = "your_protected_file.xls" decrypted = io.BytesIO() with open(file_path, 'rb') as f: file = msoffcrypto.OfficeFile(f) while True: pw = input('Enter password: ') try: # 先加载密码验证有效性 file.load_key(password=pw) # 验证成功后执行解密操作 file.decrypt(decrypted) # 重置IO指针到起始位置,确保pandas能读取完整内容 decrypted.seek(0) # 读取解密后的文件为DataFrame df = pd.read_excel(decrypted) print('The file has been decrypted.') break except (KeyError, Exception): print('Invalid Password. Please try again.') # 重置BytesIO对象,避免残留数据干扰下一次解密尝试 decrypted = io.BytesIO() continue # 后续数据处理示例 # print(df.head())
关键修改说明
- 调整
load_key→decrypt→read_excel的执行顺序,匹配msoffcrypto库的正确使用流程 - 将密码验证、解密操作纳入
try块,捕获密码错误的KeyError及其他可能出现的异常 - 每次解密失败后重置
BytesIO对象,避免旧数据影响下一次尝试 - 解密后调用
decrypted.seek(0)将IO指针移至开头,保证pandas能读取到完整的解密文件内容
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

