F. Транслитерация 2.0

Для международных документов русский текст преобразуется с использованием латинского алфавита. ГОСТ Р 52535.1-2006 задаёт правила транслитерации идентификационных карт.
Ниже приведена таблица замен:

  • А — A
  • Б — B
  • В — V
  • Г — G
  • Д — D
  • Е — E
  • Ё — E
  • Ж — ZH
  • З — Z
  • И — I
  • Й — I
  • К — K
  • Л — L
  • М — M
  • Н — N
  • О — O
  • П — P
  • Р — R
  • С — S
  • Т — T
  • У — U
  • Ф — F
  • Х — KH
  • Ц — TC
  • Ч — CH
  • Ш — SH
  • Щ — SHCH
  • Ы — Y
  • Э — E
  • Ю — IU
  • Я — IA

Давайте транслитерируем русский текст.
Букву «ё» транслитерируйте как «e», «й» как «и», а «ъ» и «ь» (и их заглавные версии «Ъ» и «Ь») должны исчезнуть из текста. Строчные буквы заменяются на строчные, заглавные заменяются на заглавные. Если заглавная буква превращается при транслитерации в несколько букв, то заглавной должна остаться только первая из них (например, «Ц» → «Tc»). Все некириллические символы должны остаться на месте.

Формат ввода

В одной папке с вашей программой лежит файл cyrillic.txt. В нём, в числе прочих, содержится некоторое количество кириллических символов.

Формат вывода

В файл transliteration.txt записать результат транслитерации исходного файла.

Пример

Ввод

Привет, мир!

Вывод

Privet, mir!

Ввод

Я помню чудное мгновенье: Передо мной явилась ты, Как мимолетное виденье, Как гений чистой красоты.

Вывод

Ia pomniu chudnoe mgnovene: Peredo mnoi iavilas ty, Kak mimoletnoe videne, Kak genii chistoi krasoty.

Решение

Довольно простая задача на словари и работу с файлами. Основной алгоритм берем из задачи J. Транслитерация. Работу с файлами удобнее всего организовать с помощью менеджера контекста with.

Работу с файлами в такого типа задачах можно организовать двумя способами:
Cначала прочитать данные, преобразовать их и только потом записать. Это минимизирует время работы с файлами.
Второй способ – открыть оба файла и сразу записывать преобразованные данные по мере обработки. Этот подход минимизирует использование памяти.
В реальной разработке, при обработке больших объемов данных, эти способы зачастую комбинируются.

Посмотреть код

Решение

Python
alphabet = {
    'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'E',
    'Ж': 'ZH', 'З': 'Z', 'И': 'I', 'Й': 'I', 'К': 'K', 'Л': 'L', 'М': 'M',
    'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
    'Ф': 'F', 'Х': 'KH', 'Ц': 'TC', 'Ч': 'CH', 'Ш': 'SH', 'Щ': 'SHCH',
    'Ы': 'Y', 'Э': 'E', 'Ю': 'IU', 'Я': 'IA', 'Ь': '', 'Ъ': ''
}

with open('transliteration.txt', 'w', encoding='UTF-8') as file_out:
    with open('cyrillic.txt', encoding='UTF-8') as file_in:
        for string in file_in:
            for char in string:
                current = char.upper()
                if current in alphabet:
                    if char.isupper():
                        char = alphabet[current].capitalize()
                    else:
                        char = alphabet[current].lower()
                else:
                    char = char
                print(char, end='', file=file_out)

Решение

Python
alphabet = {
    'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'E',
    'Ж': 'ZH', 'З': 'Z', 'И': 'I', 'Й': 'I', 'К': 'K', 'Л': 'L', 'М': 'M',
    'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
    'Ф': 'F', 'Х': 'KH', 'Ц': 'TC', 'Ч': 'CH', 'Ш': 'SH', 'Щ': 'SHCH',
    'Ы': 'Y', 'Э': 'E', 'Ю': 'IU', 'Я': 'IA', 'Ь': '', 'Ъ': ''
}

data, encoded_data = '', ''

with open("cyrillic.txt", encoding="UTF-8") as file_in:
    for string in file_in:
        data += string

for char in data:
    if char.upper() in alphabet:
        encoded_data += alphabet[char.upper()].lower().capitalize() if char == char.upper() else alphabet[char.upper()].lower()
    else:
        encoded_data += char

with open("transliteration.txt", "w", encoding="UTF-8") as file_out:
    print(encoded_data, file=file_out)
Подписаться
Уведомить о
guest
5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
nmalkam
05.12.2023 12:06

почему то работает, тест тоже прошел

буквы сами по себе высокие

наверное обновление версии Python ??

def transliteration_2():
TRANSLITERATION = {
‘А’: ‘A’,
‘Б’: ‘B’,
‘В’: ‘V’,
‘Г’: ‘G’,
‘Д’: ‘D’,
‘Е’: ‘E’,
‘Ё’: ‘E’,
‘Ж’: ‘Zh’,
‘З’: ‘Z’,
‘И’: ‘I’,
‘Й’: ‘I’,
‘К’: ‘K’,
‘Л’: ‘L’,
‘М’: ‘M’,
‘Н’: ‘N’,
‘О’: ‘O’,
‘П’: ‘P’,
‘Р’: ‘R’,
‘С’: ‘S’,
‘Т’: ‘T’,
‘У’: ‘U’,
‘Ф’: ‘F’,
‘Х’: ‘Kh’,
‘Ц’: ‘Tc’,
‘Ч’: ‘Ch’,
‘Ш’: ‘Sh’,
‘Щ’: ‘Shch’,
‘Ы’: ‘Y’,
‘Э’: ‘E’,
‘Ю’: ‘Iu’,
‘Я’: ‘Ia’,
‘Ъ’: ”,
‘Ь’: ”,
‘а’: ‘a’,
‘б’: ‘b’,
‘в’: ‘v’,
‘г’: ‘g’,
‘д’: ‘d’,
‘е’: ‘e’,
‘ё’: ‘e’,
‘ж’: ‘zh’,
‘з’: ‘z’,
‘и’: ‘i’,
‘й’: ‘i’,
‘к’: ‘k’,
‘л’: ‘l’,
‘м’: ‘m’,
‘н’: ‘n’,
‘о’: ‘o’,
‘п’: ‘p’,
‘р’: ‘r’,
‘с’: ‘s’,
‘т’: ‘t’,
‘у’: ‘u’,
‘ф’: ‘f’,
‘х’: ‘kh’,
‘ц’: ‘tc’,
‘ч’: ‘ch’,
‘ш’: ‘sh’,
‘щ’: ‘shch’,
‘ы’: ‘y’,
‘э’: ‘e’,
‘ю’: ‘iu’,
‘я’: ‘ia’,
‘ъ’: ”,
‘ь’: ”,
}
with open(‘cyrillic.txt’, ‘r’, encoding=’UTF-8′) as cyr:
lines = cyr.readlines()
with open(‘transliteration.txt’, ‘w’, encoding=’utf-8′) as t:
for line in lines:
for letter in list(line):
if letter in TRANSLITERATION:
t.write(”.join(TRANSLITERATION[letter]))
else:
t.write(letter)

nmalkam
Ответить на  Сергей Клочко
06.12.2023 08:27

тут моя ошибка в том что мне я скопировал словарь не проверив.
переделаю с другим словарём.

Последний раз редактировалось 1 год назад nmalkam ем
Александр
Александр
12.04.2024 21:15

Кажется, что более читаемо выходит
d = {
‘А’: ‘A’, ‘Б’: ‘B’, ‘В’: ‘V’, ‘Г’: ‘G’, ‘Д’: ‘D’, ‘Е’: ‘E’, ‘Ё’: ‘E’,
‘Ж’: ‘ZH’, ‘З’: ‘Z’, ‘И’: ‘I’, ‘Й’: ‘I’, ‘К’: ‘K’, ‘Л’: ‘L’, ‘М’: ‘M’,
‘Н’: ‘N’, ‘О’: ‘O’, ‘П’: ‘P’, ‘Р’: ‘R’, ‘С’: ‘S’, ‘Т’: ‘T’, ‘У’: ‘U’,
‘Ф’: ‘F’, ‘Х’: ‘KH’, ‘Ц’: ‘TC’, ‘Ч’: ‘CH’, ‘Ш’: ‘SH’, ‘Щ’: ‘SHCH’,
‘Ы’: ‘Y’, ‘Э’: ‘E’, ‘Ю’: ‘IU’, ‘Я’: ‘IA’, ‘Ь’: ”, ‘Ъ’: ”}
with open(‘cyrillic.txt’, ‘r’, encoding=’UTF-8′) as file_in:
lines = file_in.readlines()
tr_lines = list()
for i in lines:
line = ”
for v in i:
if (c := v.upper()) in d:
if v in d:
line += d[v].capitalize()
else:
line += d[c].lower()
else:
line += v
tr_lines.append(line)
with open(‘transliteration.txt’, ‘w’, encoding=’UTF-8′) as f_out:
f_out.writelines(tr_lines)