我创建了一个vigenere密码然后进行编码和解码,但在这种情况下,编码的字被写入文本文件,而deocoded部分读取编码的字并对其进行解码。问题是当我在消息或关键字中输入空格时(我们都将其转换为ascii并添加或删除)时出现错误。
我找到问题的根源[我认为]:http://imgur.com/a/6T8hf [imgur链接显示问题的2个屏幕截图]
我将读取和写入编码的单词的部分转换为注释,并将编码的单词打印到shell中,通过这样做,代码在消息和关键字中使用空格进行编码没有问题。然而,当我取消注释它们并使程序将编码的消息写入文本文件时,它会出现错误,说明" '字符表'不能编码字符"。如果有人可以提供帮助,我会非常感激!
encode="" # encoded text is saved in this variable
decode="" # decoded text is saved in this variable
encodedTextSaved="" # what the read encoded text from the text file is saved in
decodedText = "" # When the encoded text is read back in from the file it goes in this variable
from itertools import cycle
def encrypt(message,keyWord): #defines the variable named 'encrypt'
def encryptLetter(letterKey):
letter,keyWord=letterKey
return chr(ord(letter)+ord(keyWord)) # adds the ascii value of letter and the KeyWord togther and converts them to a character
keySeq=cycle(keyWord)
return "".join(map(encryptLetter,zip(message,keySeq)))
def decrypt(message,keyWord): # defines the variable named 'decrypt'
def decryptLetter(letterKey):
letter,keyWord=letterKey
return chr(ord(letter)-ord(keyWord)) # takes away the the ascii value of letter and the KeyWord togther and converts them to a character
keySeq=cycle(keyWord)
return "".join(map(decryptLetter,zip(message,keySeq)))
start = input("Do you want to start this ingenuitive program (y/n): ")
if start == 'y':
print()
while 1==1:
decision=input('Do you wish to Encrypt(1) or Decrypt(2) a message or Quit(3): ')
if decision == '1':
while 1==1:
text=input("Enter text message to encode: ")
if text == '':
print()
print("Enter Something!")
print()
else: break
while 1==1:
keyWord=input("Enter keyword : ").lower()# Enter the message to be encoded / made sure that the input is turned all to lower case
if keyWord == '':
print()
print("Enter Something!")
print()
else: break
encode = encrypt(text, keyWord) # runs the defined encrypt variable with the inputs 'text' and 'keyWord'
myFile = open('data.txt', 'w') # This opens the file called 'data.txt' so we can write to it
myFile.write(encode) #writes the encoded word to the text file named 'data.txt'
myFile.close
#print ("encoded word is --> " + encode)
elif decision == '2':
myFile = open("data.txt","r") # This opens the file called 'data.txt' so we can read it
encodedTextSaved=myFile.readlines() # This reads the encoded text into the variable encodedTextSaved
myFile.close()
decodedText=encodedTextSaved[0]
while 1==1:
keyWord=input("Enter keyword : ").lower()# Enter the message to be encoded / made sure that the input is turned all to lower case
if keyWord == '':
print()
print("Enter Something!")
print()
else: break
decode = decrypt(decodedText, keyWord)# runs the defined decrypt variable with the inputs 'decodedText' and 'keyWord'
print ("the decoded text is > " + decode)
elif decision == 'no' or 'No': # if the user does not want to carry on then it quits the program
print("Okay then....Bye")
break
elif decision == '3': # if the user chooses option 3 it breaks the while loop and closes the program
print()
break
else: print("Invalid") # if user enters anything that is not what the program asks for it gives the user a second chance as the input is 'invalid'
if start == 'n': # if the user enters 'n' it does not proceed with the code and quits it
print()
print("We hope that you shall use this program again in the not so distant future")
答案 0 :(得分:1)
您的加密使用的是文本文件的默认编码不支持的字符。在Python 3中,文本字符串是Unicode,因此在将它们写入文件时指定编码。 utf8
处理所有Unicode字符,因此是一个不错的选择。还要确保调用 myFile.close
(缺少括号):
myFile = open('data.txt', 'w',encoding='utf8')
myFile.write(encode)
myFile.close()
在回读数据时指定相同的编码:
myFile = open("data.txt","r",encoding='utf8')