Python3.9环境下读取TXT执行凯撒解密遇ord()报错的修复求助
Python 3.9 凯撒密码TXT解密报错修复
问题现象
编写凯撒密码解密功能时,目标是读取本地TXT文件完成解密,运行代码触发报错:ord() expected a character, but a string of length 586 was found,运行环境为Python 3.9。
报错根因
核心逻辑错误出在文件读取环节:
- 原有代码
text = open(input("enter string: "))仅创建了文件操作对象,并未实际读取TXT内的文本内容 - 直接把文件对象传入解密函数后,函数内的逐字符遍历会按行读取文件内容,第一次拿到的就是长度为586的整行文本
- 后续代码将整行文本传入
ord()方法,而ord()仅支持传入长度为1的单个字符,直接触发参数不匹配报错
修复方案
- 调整文件读取逻辑,通过文件对象的
read()方法拿到完整文本内容后,再传入解密函数处理 - 改用
with上下文管理器操作文件,自动管理文件句柄的打开与关闭,避免资源泄漏 - 兼容非字母字符的处理逻辑,避免换行、数字、标点等特殊字符破坏解密流程
- 读取文件时指定
utf-8编码,减少跨平台读取中文TXT的乱码问题
修复后完整可运行代码
def decrypt(string, shift): cipher = '' for char in string: # 保留非字母字符(空格、换行、数字、标点等) if not char.isalpha(): cipher = cipher + char elif char.isupper(): cipher = cipher + chr((ord(char) - shift - 65) % 26 + 65) else: cipher = cipher + chr((ord(char) - shift - 97) % 26 + 97) return cipher # 读取TXT文件内容 file_path = input("请输入TXT文件的完整路径:") with open(file_path, 'r', encoding='utf-8') as f: plain_content = f.read() shift_num = int(input("请输入解密偏移量:")) print("="*30) print("原始TXT内容:\n", plain_content) print("解密后结果:\n", decrypt(plain_content, shift_num))
效果验证
代码运行后会提示输入TXT文件路径、解密偏移量,不会再触发ord()参数长度不匹配的报错,非英文字母的内容会直接原样保留,仅对大小写英文字母按凯撒规则完成偏移解密。
内容的提问来源于stack exchange,提问作者cla
相关产品推荐
相关产品推荐

