Свой шифр (замена символов) Python
Сегодня я начал писать простой шифр и столкнулся с проблемой – замена происходит в некоторых частях.
Заменял я вот это:
hello world
Ожидание:
abiik nkvif
А получил:
aeiio worid
Собственно вот код (я ещё не доделал):
print('1 - Закодирование файла')
oper = input('Выберете операцию: ')
if str(oper) == str(1):
file = input('Название файла: ')
of = open(file,'r')
ce = of.read()
a = ce
b = a.replace('q','m')
c = b.replace('w','n')
d = c.replace('e','b')
e = d.replace('r','v')
f = e.replace('t','c')
g = f.replace('y','x')
h = g.replace('u','z')
i = h.replace('i','l')
j = i.replace('o','k')
k = j.replace('p','j')
l = k.replace('a','h')
m = l.replace('s','g')
n = m.replace('d','f')
o = n.replace('f','d')
p = o.replace('g','s')
q = p.replace('h','a')
r = q.replace('j','p')
s = r.replace('k','o')
t = s.replace('l','i')
u = t.replace('z','u')
v = u.replace('x','y')
w = v.replace('c','t')
x = w.replace('v','r')
y = x.replace('b','e')
z = y.replace('n','w')
z2 = a.replace('m','q')
of.close
of = open(file,'w')
of.write(z2)
Пытался заменить 1 букву на разные (уже сделано в коде) – не помогло. Результат тот же.
Ответы (3 шт):
Рассмотрим букву w. Сначала w заменится на n c = b.replace('w','n'). А потом n, на которое изменилось w, заменится на w z = y.replace('n','w'). Поэтому кажется, что не изменилась буква, хотя она изменялась дважды (w->n->w). Нужно сделать посимвольную проверку строки.
f_kripto=open('kripto.txt', 'w')
for i in range(int(len(ce))):
\\здесь идЁт замена i-ого символа согласно твоей таблице
if ce[i]=='q':
f_kripto.write('m')
\\и так далее, через elif
f_kripto.close()
Вместо вашей долгой последовательности просто примените словарь — его можете создать например так:
from_letter = 'qwerty...'
to_letter = 'mnbvcx...'
change_to = dict(zip(from_letter, to_letter))
Затем примените его для шифрования:
encoded = ''
for letter in ce:
encoded += change_to[letter]
Вся ваша программа может затем выглядеть так:
from_letter = 'qwerty...'
to_letter = 'mnbvcx...'
change_to = dict(zip(from_letter, to_letter))
change_to['\n'] = ['\n']
print('1 - Закодирование файла')
oper = input('Выберете операцию: ')
if oper == '1':
filename = input('Название файла: ')
with open(filename) as of:
ce = of.read()
encoded = ''
for letter in ce:
encoded += change_to[letter]
with open(filename, 'w') as of:
of.write(encoded)
В Python уже есть встроенная функция для этого.
str.maketrans
In [1]: s1 = 'qwertyuiopasdfghjklzxcvbnm'
In [2]: s2 = 'mnbvcxzlkjhgfdsapoiuytrewq'
In [3]: translation = str.maketrans(s1, s2)
In [4]: "Super string".translate(translation)
Out[4]: 'Szjbv gcvlws'
In [5]: "hello world".translate(translation)
Out[5]: 'abiik nkvif'