UnicodeEncodeError при использовании пробела

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

person blawrence    schedule 15.02.2016    source источник
comment
Пожалуйста, не включайте текст в качестве изображения.   -  person roeland    schedule 16.02.2016


Ответы (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')
person Mark Tolonen    schedule 16.02.2016
comment
Спасибо ! Я очень ценю вашу помощь - person blawrence; 16.02.2016