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')
Другие вопросы по тегам