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

Python实现lazy_encrypt写文件触发KeyError异常问题求解

错误原因

你代码的判断逻辑和取值逻辑的字符大小写不一致:

  • 判断字符是否存在于字典键时,你调用了c.lower()将当前字符转为小写后判断
  • 实际从字典取值时,你直接使用未做小写转换的原字符c作为键

假设你的映射字典里只有小写字符作为键,当读取到大写字符P时,c.lower() in a_dictionary会返回True,触发取值逻辑,但a_dictionary[c]中的c是大写的P,字典中不存在该键,因此抛出KeyError。

除此之外你的代码还有两个隐含问题:

  • 先用split()拆分每行内容再用' '.join()拼接,会把原文件的行首空格、行尾空格、连续多个空格统一替换为单个空格,改变原文件的空格格式
  • 直接通过open()打开文件未做异常捕获,一旦运行过程中出现报错,会导致文件句柄未正常关闭
修复后的代码
def lazy_encrypt(output_path, input_path, a_dictionary):
    # 使用with上下文管理器自动管理文件句柄,出现异常也能正常关闭文件
    with open(input_path, 'r', encoding='utf-8') as in_file, open(output_path, 'w', encoding='utf-8') as out_file:
        for line in in_file:
            processed_chars = []
            for c in line:
                # 方案1:映射区分大小写,只有完全匹配才替换
                if c in a_dictionary:
                    processed_chars.append(a_dictionary[c])
                # 方案2:映射不区分大小写,统一按小写键匹配,替换后保留原字符大小写
                # lower_c = c.lower()
                # if lower_c in a_dictionary:
                #     replaced_char = a_dictionary[lower_c]
                #     processed_chars.append(replaced_char.upper() if c.isupper() else replaced_char)
                else:
                    processed_chars.append(c)
            out_file.write(''.join(processed_chars))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:57:01