Как переименовать файл

Рейтинг: -1Ответов: 2Опубликовано: 14.01.2023
def normalize(item_path):
    CYRILLIC_SYMBOLS = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяєіїґ"
    TRANSLATION = ("a", "b", "v", "g", "d", "e", "e", "j", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t",
                   "u", "f", "h", "ts", "ch", "sh", "sch", "", "y", "", "e", "yu", "ya", "je", "i", "ji", "g")
    TRANS = {}
    for cyril_symb, latin_symb in zip(CYRILLIC_SYMBOLS, TRANSLATION):
        TRANS[ord(cyril_symb)] = latin_symb
        TRANS[ord(cyril_symb.upper())] = latin_symb.upper()
    table = item_path.maketrans(TRANS)
    return str(item_path).translate(table)

for file_path in files_paths:
    new_name = normalize(split(file_path)[-1].split('.')[0])
    os.rename(split(file_path)[-1], new_name + '.' + split(file_path)[-1].split('.')[-1])

Пытаюсь переименовать файлы с русского на английский. Например если файл: Архив.rar нужно его переименовать в Archiv.rar. Но у меня выдаёт ошибку:

Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 100, in <module>
    os.rename(split(file_path)[-1], new_name + '.' + split(file_path)[-1].split('.')[-1])
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'Архив.rar' -> 'Arhiv.rar'

То есть я правильно беру по срезам все, но не понимаю почему не работает.

Ответы

▲ 1Принят
translation = {
    'а': 'a',
    'б': 'b',
    'в': 'v',
    'г': 'g',
    'д': 'd',
    'е': 'e',
    'ё': 'j',
    'ж': 'zh',
    'з': 'z',
    'и': 'i',
    'й': 'j',
    'к': 'k',
    'л': 'l',
    'м': 'm',
    'н': 'n',
    'о': 'o',
    'п': 'p',
    'р': '',
    'с': 's',
    'т': 't',
    'у': 'u',
    'ф': 'f',
    'х': 'h',
    'ц': 'ts',
    'ч': 'ch',
    'ш': 'sh',
    'щ': 'sch',
    'ъ': '',
    'ы': 'y',
    'ь': '',
    'э': 'e',
    'ю': 'yu',
    'я': 'ya',
    'є': 'je',
    'і': 'i',
    'ї': 'ji',
    'ґ': 'g',
    'А': 'A',
    'Б': 'B',
    'В': 'V',
    'Г': 'G',
    'Д': 'D',
    'Е': 'E',
    'Ё': 'J',
    'Ж': 'ZH',
    'З': 'Z',
    'И': 'I',
    'Й': 'J',
    'К': 'K',
    'Л': 'L',
    'М': 'M',
    'Н': 'N',
    'О': 'O',
    'П': 'P',
    'Р': '',
    'С': 'S',
    'Т': 'T',
    'У': 'U',
    'Ф': 'F',
    'Х': 'H',
    'Ц': 'TS',
    'Ч': 'CH',
    'Ш': 'SH',
    'Щ': 'SCH',
    'Ъ': '',
    'Ы': 'Y',
    'Ь': '',
    'Э': 'E',
    'Ю': 'YU',
    'Я': 'YA',
    'Є': 'JE',
    'І': 'I',
    'Ї': 'JI',
    'Ґ': 'G'
}
name = 'Архив.rar'

print(''.join(map(lambda x: translation.get(x, x), name)))
# Ahiv.rar

Только я бы, на Вашем месте, еще и замену для пробела добавил на _ (к примеру)

Или через либу, как писал в комментарии
pip install transliterate

from transliterate import translit

print(
    translit('Архив.rar', 'ru', reversed=True)
)
# Arhiv.rar

С переименованием

from pathlib import Path
# Считаем что переменную translation мы уже создали
name = 'Архив.rar'

def rename_file(original_file_path: Path):
    new_file_path = original_file_path.absolute().parent.joinpath(
        ''.join(map(lambda x: translation.get(x, x), original_file_path.name))
    )
    if original_file_path.exists() and original_file_path.is_file():
        original_file_path.rename(new_file_path)

rename_file(Path('Архив.rar'))
▲ 1

У меня ваш код отработал нормально. Я только добавил импорт:

from os.path import split
import os

Кириличные имена файлов заменились на латиницу. Я вижу в Вашем тексте два скользких места:

  1. Вы используете два разных метода split() вперемешку. split(file_path) работает с путями в файловой системе. .split('.') работает со строками.

Вроде всё работает правильно, но как-то не очень красиво...

  1. Вы работает в винде, а винда не различает большие и малые буквы в именах файлов. В тоже время, имя файла 'Архив.rar' содержит заглавную букву.

У меня в люнихе Ваша программа отработала абсолютно нормально с именами файлов, содержащих заглавные буквы:

Андрей_2023-01-12.jpg  Andrej_2023-01-12
КартаГранкины.pdf      KartaGrankiny
ПодаркиМне.txt         PodarkiMne
РФФ.csv                RFF