从文本文件获取输入以实现Caesar Cipher

时间:2018-08-21 12:33:47

标签: python caesar-cipher

我正在尝试在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)

请不要介意这种业余编码,因为我不擅长并希望对其进行改进。谢谢。

3 个答案:

答案 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))

将更改提交到文件。