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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:21:09