Транслитерация имен файлов с Python

28 февраля 2015. Комментарии .

У меня есть похожая запись о транслитерации содержимого файла. Здесь же будут транслитерированы только имена файлов.

Если активно пользуешься терминалом, часто возникает желание убрать пробелы из имен файлов и иногда даже кириллицу.

Итак, перед нами стоит задача группового переименования файлов. Например, нужно поменять имена всех файлов в директории. Хотим избавиться от пробелов — заменить их на нижние подчеркивания. Все кириллические буквы хотим поменять на латинские (на «транслит»).

Вот скрипт, написанный на питоне, который совершает такое массовое переименование файлов. Надо создать файл renamer.py с приведенным ниже содержанием, положить его в папку с переименовываемыми файлами и выполнить:

user $
python3 renamer.py -p

И в выводе программы будет показано, как будут переименованы файлы, но изменений не произойдет. Если Вы окажетесь довольны результатами, сделайте на всякий случай резервную копию директории и выполните python3 renamer.py. За ключик -p спасибо комментарию от hombit’a.

Файл Русский Текст.TXT переименуется в russkiy_tekst.txt. Поведение скрипта благодаря его простоте очень легко подстроить под свои нужды, даже совсем не разбираясь в питоне. В строках с 13 по 82 в левом столбце в кавычках стоит то, что подлежит замене; в правом столбце — то, на что нужно заменять. Добавляйте свои замены и корректируйте существующие по своему усмотрению.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import os
from sys import argv

def latinizator(letter, dic):
for i, j in dic.items():
letter = letter.replace(i, j)
return letter

legend = {
' ':'_',
',':'',
'а':'a',
'б':'b',
'в':'v',
'г':'g',
'д':'d',
'е':'e',
'ё':'yo',
'ж':'zh',
'з':'z',
'и':'i',
'й':'y',
'к':'k',
'л':'l',
'м':'m',
'н':'n',
'о':'o',
'п':'p',
'р':'r',
'с':'s',
'т':'t',
'у':'u',
'ф':'f',
'х':'h',
'ц':'c',
'ч':'ch',
'ш':'sh',
'щ':'shch',
'ъ':'y',
'ы':'y',
'ь':"'",
'э':'e',
'ю':'yu',
'я':'ya',

'А':'A',
'Б':'B',
'В':'V',
'Г':'G',
'Д':'D',
'Е':'E',
'Ё':'Yo',
'Ж':'Zh',
'З':'Z',
'И':'I',
'Й':'Y',
'К':'K',
'Л':'L',
'М':'M',
'Н':'N',
'О':'O',
'П':'P',
'Р':'R',
'С':'S',
'Т':'T',
'У':'U',
'Ф':'F',
'Х':'H',
'Ц':'Ts',
'Ч':'Ch',
'Ш':'Sh',
'Щ':'Shch',
'Ъ':'Y',
'Ы':'Y',
'Ь':"'",
'Э':'E',
'Ю':'Yu',
'Я':'Ya',
}

for file_old in os.listdir('.'):

file_new = latinizator(file_old, legend)

#Раскомментируйте, чтобы сделать первую букву в имени файла Прописной
#file_new = file_new.capitalize()

if '-p' in argv:
if file_old == file_new:
print ('{0: <30}'.format(file_old), 'не будет переименован' )
else:
print ('{0: <30}'.format(file_old), 'будет переименован в ', file_new )
else:
if file_old != file_new:
print ('{0: <30}'.format(file_old), 'переименован в ', file_new )
os.rename(file_old, file_new)

P.S. Функцию для замены ключа словаря на его значение подсмотрел тут.