Я создал шифр Виженера, затем кодирует и декодирует, но в этом случае закодированное слово записывается в текстовый файл, а раздел декодирования считывает закодированное слово и декодирует его. Проблема в том, что у меня возникает ошибка, когда я ввожу пробелы либо в сообщение, либо в ключевое слово (оба из них преобразуются в ascii и добавляются или удаляются).
Я нашел источник проблемы [я думаю]: http://imgur.com/a/6T8hf [ссылка imgur, которая показывает 2 скриншота проблемы]
Раздел, который читает и записывает кодированное слово в текстовый файл, я превратил в комментарий и заставил кодированное слово печатать в оболочке, благодаря этому код не имеет проблем с кодировкой пробелами как в сообщении, так и в ключевом слове. Однако, когда я их раскомментирую и заставляю программу записывать закодированное сообщение в текстовый файл, появляется сообщение об ошибке «charmap» не может кодировать символ». Если бы кто-нибудь мог помочь, я был бы очень признателен!
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")