Как ROT13 кодировать в Python3?

Документация по Python 3 содержит рот13, указанный на странице кодеков.

Я попытался кодировать строку с использованием кодировки rot13:

import codecs
s  = "hello"
os = codecs.encode( s, "rot13" )
print(os)

Это дает unknown encoding: rot13 ошибка. Есть ли другой способ использовать встроенную кодировку rot13? Если эта кодировка была удалена в Python 3 (как показывают результаты поиска Google), почему она все еще указана в документации Python3?

5 ответов

Решение

Ага! Я думал, что он был удален из Python 3, но нет - просто изменился интерфейс, потому что кодек должен возвращать байты (а это str-to-str).

Это из http://www.wefearchange.org/2012/01/python-3-porting-fun-redux.html:

import codecs
s   = "hello"
enc = codecs.getencoder( "rot-13" )
os  = enc( s )[0]

В Python 3.2+ есть rot_13 кодек str-to-str:

import codecs

print(codecs.encode("hello", "rot-13")) # -> uryyb

rot_13 был удален в Python 3.0, а затем добавлен обратно в v3.2. rot13 был добавлен еще в v3.4.

codecs.encode( s, "rot13" ) отлично работает в Python 3.4+

Собственно, теперь вы можете использовать любой знак препинания между rot а также 13 сейчас, в том числе:

rot-13, rot@13, rot#13, так далее.

https://docs.python.org/3/library/codecs.html#text-transforms

Новое в версии 3.2: Восстановление текстового преобразования rot_13.
Изменено в версии 3.4: Восстановление псевдонима rot13.

def rot13(message):
    Rot13=''
    alphabit = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for i in message:
        if i in alphabit:
            Rot13 += alphabit[alphabit.index(i) + 13]
        else:
            Rot13 += i
    return Rot13
        

Код очень большой, но я только учусь

Для начала вам нужно установить библиотеку Python - https://pypi.org/project/endecrypt/

pip установить endecrypt (windows)
pip3 установить endecrypt (linux)

тогда,

from endecrypt import cipher

message_to_encode = "Hello World"
conversion = 'rot13conversion'

cipher.encode(message_to_encode, conversion )
# Uryyb Jbeyq

message_to_decode = "Uryyb Jbeyq"

cipher.decode(message_to_decode, conversion)
# Hello World
Другие вопросы по тегам