UnicodeEncodeError при использовании пробела
Я создал шифр Vigenere, затем кодирует и декодирует, но в этом случае закодированное слово записывается в текстовый файл, а секция деокодирования считывает закодированное слово и декодирует его. Проблема в том, что у меня ошибка при вводе пробелов либо в сообщении, либо в ключевом слове (оба преобразуются в 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")
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')