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
相关产品推荐
相关产品推荐

