我正在尝试在Python中实现Caesar密码,其中我的程序将从文本文件(即input_file.txt
)中获取输入,并将加密后的文本作为输出写入另一个名为output_file.txt
的文本文件中。输入文件包含:
Attack On Titans 4
其中"Attack On Titan"
是要加密的字符串,而4
是加密算法的密钥。该字符串的正确输出应为
Exxego Sr Xmxerw
但是我的程序给了我
Exxego Sr Xmxerwv
,即一个额外的字符v 。这是我的审核代码:
data = open("input_file.txt", "r")
text = data.readline()
print(text)
key = int(data.readline())
def encrypt(text,key):
result = ""
for i in range(len(text)):
char = text[i]
if char == ' ':
result += ' '
elif char.isupper():
result += chr((ord(char) + key-65) % 26 + 65)
else:
result += chr((ord(char) + key - 97) % 26 + 97)
return result
ex= open("output_file.txt","w")
ex.write(encrypt(text,key))
print(encrypt(text , key))
我只是想知道为什么会得到这个不正确的输出,尽管我知道如果通过执行以下操作更改for语句可以使它正确:
for i in range(len(text)-1)
请不要介意这种业余编码,因为我不擅长并希望对其进行改进。谢谢。
答案 0 :(得分:1)
data.readline()
将给您尾随换行符\n
。您需要先调用text.strip()
,然后再传递给encrypt
函数以摆脱它。
答案 1 :(得分:1)
似乎您正在读取的文件中包含尾随换行符。
在python解释器中对其进行测试:
>>> a = '\n'
>>> (ord(a)+4-97) % 26 + 97
118
>>> chr(118)
'v'
在将test.strip()
传递到您的加密函数之前,先调用ex.close()
删除尾随空格。
顺便说一句,您应该明确关闭文件,例如with open('', 'r') as ex:
ex.write('bar')
或包裹在这样的块中,以防止文件损坏。
Test1
答案 2 :(得分:0)
data.readline()将'\ n'(换行符)保留在行尾。这就是为什么输出中要包含额外字符的原因。
要删除它,您可以替换
text = data.readline()
作者
text = data.readline().rstrip('\n')
将在末尾删除“ \ n”。
text.strip()(请参阅其他答案)将从字符串的两端删除所有whitespace characters。因此,如果这不是预期的行为,请使用.rstrip('\ n'),它仅删除字符串末尾的'\ n'。
您还应该添加
ex.close()
之后
ex.write(encrypt(text,key))
将更改提交到文件。