Помогите переименовать файл пожалуйста
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'
То есть я правильно беру по срезам все, но не понимаю почему не работает.
Ответы (2 шт):
У меня ваш код отработал нормально. Я только добавил импорт:
from os.path import split
import os
Кириличные имена файлов заменились на латиницу. Я вижу в Вашем тексте два скользких места:
- Вы используете два разных метода split() вперемешку. split(file_path) работает с путями в файловой системе. .split('.') работает со строками.
Вроде всё работает правильно, но как-то не очень красиво...
- Вы работает в винде, а винда не различает большие и малые буквы в именах файлов. В тоже время, имя файла 'Архив.rar' содержит заглавную букву.
У меня в люнихе Ваша программа отработала абсолютно нормально с именами файлов, содержащих заглавные буквы:
Андрей_2023-01-12.jpg Andrej_2023-01-12
КартаГранкины.pdf KartaGrankiny
ПодаркиМне.txt PodarkiMne
РФФ.csv RFF
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'))