Пятница, 19.04.2024, 20:04 | RSS | Приветствую Вас Гость
Главная | Регистрация | Вход
Меню сайта
Категории раздела
Разное [10]
Решения задач (студентам) [9]
PC Игры - кодинг [2]
Python [1]
PHP, Mysql [1]
HTML, CSS, Javascript [1]
Scilab [1]
Поиск
Опрос
Какой язык программирования Вы предпочитаете?
Всего ответов: 44
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Python

Python. Скрипт для транслитерации имен списка файлов с русскими названиями.
Думаю, объяснять, почему это реализовано на Python - не требуется... А потому, сразу к делу.
Само собой разумеется задействуем модуль os, который позволит получить список файлов в каталоге и предоставит функцию для переименования.

import os

Так как смысл программы в том, чтобы переделать русские буквы в латинские (или их сочетания), потребуется сделать некую функцию, которая будет посимвольно обрабатывать строку и заменять русские буквы на латинские. Для этого создадим в том же каталоге, гдебудет лежать основной скрипт еще один файл - rusconv.py - со следующим содержанием.

# -*- coding: cp1251 -*-
def convertChar(str):
    nname = ''
    for c in str:
        if (c == 'а') | (c == 'А'):
            nname += 'a'
        if (c == 'б') | (c == 'Б'):
            nname += 'b'
        if (c == 'в') | (c == 'В'):
            nname += 'v'
        if (c == 'г') | (c == 'Г'):
            nname += 'g'
        if (c == 'д') | (c == 'Д'):
            nname += 'd'
        if (c == 'е') | (c == 'Е'):
            nname += 'e'
        if (c == 'ё') | (c == 'Ё'):
            nname += 'e'
        if (c == 'ж') | (c == 'Ж'):
            nname += 'j'
        if (c == 'з') | (c == 'З'):
            nname += 'z'
        if (c == 'и') | (c == 'И'):
            nname += 'i'
        if (c == 'й') | (c == 'Й'):
            nname += 'i'
        if (c == 'к') | (c == 'К'):
            nname += 'k'
        if (c == 'л') | (c == 'Л'):
            nname += 'l'
        if (c == 'м') | (c == 'М'):
            nname += 'm'
        if (c == 'н') | (c == 'Н'):
            nname += 'n'
        if (c == 'о') | (c == 'О'):
            nname += 'o'
        if (c == 'п') | (c == 'П'):
            nname += 'p'
        if (c == 'р') | (c == 'Р'):
            nname += 'r'
        if (c == 'с') | (c == 'С'):
            nname += 's'
        if (c == 'т') | (c == 'Т'):
            nname += 't'
        if (c == 'у') | (c == 'У'):
            nname += 'u'
        if (c == 'ф') | (c == 'Ф'):
            nname += 'f'
        if (c == 'х') | (c == 'Х'):
            nname += 'h'
        if (c == 'ц') | (c == 'Ц'):
            nname += 'ts'
        if (c == 'ч') | (c == 'Ч'):
            nname += 'tch'
        if (c == 'ш') | (c == 'Ш'):
            nname += 'sh'
        if (c == 'щ') | (c == 'Щ'):
            nname += 'sch'
        if (c == 'ъ') | (c == 'Ъ'):
            nname += ''
        if (c == 'ы') | (c == 'Ы'):
            nname += 'y'
        if (c == 'ь') | (c == 'Ь'):
            nname += "'"
        if (c == 'э') | (c == 'Э'):
            nname += 'e'
        if (c == 'ю') | (c == 'Ю'):
            nname += 'iu'
        if (c == 'я') | (c == 'Я'):
            nname += 'ia'
        if (c == ' ') | (c == '_'):
            nname += '_'
        if c == '\'':
            nname += '\''
        if c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890()!@#$%^&-+=.':
            nname += c
    return nname

Таким образом, модуль rusconv содержит функцию преобразования основой которой является набор условий для букв русского алфавита (прописных и заглавных) и для некоторых символов: пробела, подчеркивания и опострофа. Обратите внимание, что опостроф записан как \' (бэк-слэш и опостроф). И особое внимание на последнее условие. Сначала предполагалось вместо этого условия написать else, в котором выполнялась бы строка nname += c. Но из за непредвиденных результатов (странные символы в результирующих именах, русские буквы через одну), лучшим решением оказалось сделать выполнение этой строки по строго заданному условие. То есть, если символ входит в эту строку (строку с буквами английского алфавита и символами, допустимыми в именах файлов), то оставлять этот символ без изменений. Такая схема работает безотказно! Возвращает функция ту же русскую строку, которую в нее передали, но в траслитерации.

После этого, подключаем наш модуль  в основной скрипт.

import rusconv

А далее остается легкая часть. Организовывается ввод полного пути к каталогу с файлами, которые требуется переименовать, с помощью raw_input(). Получаем список файлов в этом каталоге с помощью os.listdir(). Устанавливаем этот каталог в качестве рабочего с помощью os.chdir(). В цикле обрабатываем полученный ранее список каталогов. А именно, получаем полное имя текущего файла путем объединения последовательности каталогов и имени файла.

fullname = os.path.join(fld, x)

Определяем, является ли текущий файл файлом (это может быть и каталог, так как os.listdir() выдает список имен всего, что есть в каталоге!).

if os.path.isfile(fullname):

Если же все-таки это файл, отсекаем от имени расширение.

f_ext = os.path.splitext(fullname)[1]

splitext() разбивает полное имя на две строки. В певой оказывается все кроме расширения, а вот во второй интересующее нас расширение файла с точкой (к примеру, '.txt'). Именно поэтому в квадратных скобках стоит индекс 1. Выделить и запомнить расширение текущего файла важно, так как транслитерацию для расширения делать не надо. Его позже следует приписать к новому имени файла в первозданном виде. Далее выделяем имя файла без расширения и прочих ненужных частей. Вероятно лучше его выделить с помощью разбияния по расширению, так как разбиение просо по точке крайне не надежно (имена могут быть с точками посередине!).

f_name = x.split(f_ext)[0]

Затем для получения нового имени передаем имя файла в функцию, описанную в модуле rusconv.

new_name = rusconv.convertChar(f_name)

И вызываем функцию переименования с использаванием нового имени и сохраненного ранее расширения.

os.rename(x, new_name + f_ext)

Вот собственно и все! Такой скрипт позволит сэкономить кучу времени и нервов.
Примечание.
Строка

# -*- coding: cp1251 -*-

в начале файла со скриптом указывает интерпретатору использовать кодировку cp1251, чтобы не возникало проблем с русскими буквами.

Версия программы для для Windows (с .exe-файлом)


Поделиться ссылкой в соц. сетях:

Категория: Python | Добавил: =Sanek= (16.05.2011)
Просмотров: 4466 | Комментарии: 2 | Теги: python, FName Converter, скрипты | Рейтинг: 0.0/0
Всего комментариев: 2
2 =Sanek=  
0
Еще раз прошу прощения... Подправил название... wacko

1 =Sanek=  
0
Извиняюсь за кривой спойлер... Все исправил... smile

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

© 2024 raznocoding.do.am