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

循环读取文件触发UnicodeDecodeError,单次读取正常求排查

问题排查与解决方案

核心错误分析

你遇到的UnicodeDecodeError是因为解密后的字节序列无法被解析为有效的UTF-8 JSON字符串,单步执行正常但循环执行出错的情况,大概率和SE对象状态未重置或文件读取的隐性编码问题有关,以下是具体排查和修复步骤:


1. 修复文件读取的编码问题

当前open(SF_list[x]).read()使用系统默认编码读取文件,可能导致base64格式的加密内容出现乱码。明确指定UTF-8编码读取:

src = open(SF_list[x], 'r', encoding='utf-8').read()

2. 重置SE对象状态

循环中若复用同一个SE实例,前一次处理的data属性可能残留状态干扰后续解密逻辑。需在每次循环内重新实例化SE:

if __name__ == '__main__':
    if vault == '':
        for x, file_path in enumerate(SF_list):
            src = open(file_path, 'r', encoding='utf-8').read()
            # 每次循环创建新的SE实例,替换为你的实际SE类名
            SE = YourSEClass()
            SE.data = SFC.decrypt(src)
            print(f'[{x}] - {SE.getName()}({SF_names[x]})')

3. 完善解密函数的Padding验证逻辑

当前解密代码的Padding处理不够严谨,若解密后字节的Padding无效,会直接导致JSON解析失败。优化decrypt函数:

def decrypt(save: str) -> dict:
    save = base64.b64decode(save)
    save = CIPHER.decrypt(save)
    
    padding_symbol = save[-1]
    # 严格验证Padding的有效性,避免错误截断
    if 1 <= padding_symbol <= 16:
        expected_padding = bytes([padding_symbol]) * padding_symbol
        if save.endswith(expected_padding):
            save = save[:-padding_symbol]
        else:
            raise ValueError(f"无效Padding:最后{padding_symbol}个字节不匹配")
    else:
        raise ValueError(f"无效Padding符号:{padding_symbol}")
    
    return json.loads(save)

4. 检查加密算法的模式一致性

如果CIPHER使用CBC/GCM等需要初始化向量(IV)的模式,需确保:

  • 加密时将IV与密文绑定存储(比如前置在base64字符串头部)
  • 解密时先提取IV,再用IV初始化解密器

若使用ECB模式(不推荐),需确认密钥未被篡改且无状态污染。


额外优化:简化循环写法

避免使用range(SF_list.__len__()),改用enumerate让代码更简洁易读:

for x, file_path in enumerate(SF_list):
    sf_name = SF_names[x]
    # 后续处理逻辑

内容的提问来源于stack exchange,提问作者Filoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:07:02