Возникает ошибка при запуске программы
Ошибка выглядит следующим образом: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xef in position 0: invalid continuation byte. Моя программа выглядит так:
from tkinter import *
def file_readlines():
with open("Текст2.txt", 'r',encoding='utf-8') as f:
return(f.read())
def shifr_file_readlines(file_message, key):
s1=''
alf2 = ['а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т',
'у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']
key=alf2.index(key)
for c in file_message:
if ord(c) in range(ord('а'), ord('я')+1): # если это символ а-я
s1 += chr(ord('а') + (ord(c) - ord('а') + key)%33)
elif ord(c) in range(ord('А'), ord('Я')+1): # если это символ А-Я
s1 += chr(ord('А') + (ord(c) - ord('А') + key)%33)
else: # иначе просто дописываем этот символ
s1 += c
return ''.join(s1)
p=file_readlines()
tp2=StringVar()
txt2 = Entry(root,textvariable=tp2,width=50)
btn_filelines_cezar = Button(root, text="Зашифровать многострочный файл шифром Цезаря",command=lambda: result_file_readlines(root,p,tp2.get()),
font="Calibri 15",height=2,width=45,bg="green")
btn_filelines_cezar.place(x=0,y=390)
root.mainloop()
Как можно исправить?
UPD.
def shifr_file_readlines(file_message, key):
result=[]
alf = ['А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т',
'У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я']
alf2 = ['а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т',
'у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']
file_message=file_message.replace("\n","")
for i,txt in enumerate(file_message):
if txt.isupper():
if txt!=' ':
mes=alf.index(txt)
ky=alf2.index(key)
y=(mes+ky)%33
result.append(alf[y]+"\n")
else:
result.append(' ')
else:
if txt!=' ':
mes=alf2.index(txt)
ky=alf2.index(key)
y=(mes+ky)%33
result.append(alf2[y]+"\n")
else:
result.append(' ')
return ''.join(result)
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Дописал код из вопрос. Для расшифровки добавил флаг, т.к. ключом является буква, по которой сдвиг выполняется, а как передать отрицательный сдвиг через буквы -- вопрос.
Пример:
def shifr_file_readlines(file_message, key, decode=True):
ru_lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
ru_upper = ru_lower.upper()
if key in ru_lower:
shift = ru_lower.index(key)
elif key in ru_upper:
shift = ru_upper.index(key)
else:
raise Exception('Invalid key!')
# Для расшифровки делаем отрицательный ключ
if decode:
shift = -shift
result = []
for c in file_message:
if c in ru_lower:
i = (ru_lower.index(c) + shift) % len(ru_lower)
c = ru_lower[i]
elif c in ru_upper:
i = (ru_upper.index(c) + shift) % len(ru_upper)
c = ru_upper[i]
result.append(c)
return ''.join(result)
Использование:
cipher_text = shifr_file_readlines('Тестирование\nБуква.Ё.\n\n123', key='Г')
print(cipher_text)
# Пвопёнляэкёв
# Юрзяэ.Г.
#
# 123
print()
text = shifr_file_readlines(cipher_text, key='Г', decode=False)
print(text)
# Тестирование
# Буква.Ё.
#
# 123