Найти - Пользователи
Полная версия: Рекурсивный транслит директории
Начало » Центр помощи » Рекурсивный транслит директории
1 2
dnk8
Здрасти,
имею задачу рекурсивно перетранслитировать содержимое определённой папки; файловая система utf-8
т.е. перетранслитировать содержимое папки, подпапки и их содержимое, просто сам неопытный совсем, третий день маюсь с питоном, но толкового пока ничего не выходит, весь инет перерыл, ничего подходящего не нашёл
сам я всё пишу на shell, но встала проблема со скоростью, там может быть до 400 папок с файлами под транслитерацию, а 7 сек меня не устраивает
По этому решил насесть на питон, подскажите как это можно реализовать, а если кто-то ещё и покажет как, то буду очень примного благодарен

PS
Более менее разобрался с модулями os, string, shutil
Язык понятен, в принципе очень похож на написание на bash, так что с горем пополам чуточку понимаю

Главный вопрос конечно, из за того что я линуксоид, это сопоставление определённых комманд linux с модулями питона,
естественно задача по транслитерации будет не последней и буду изучать язык дальше, т.к. запал в душу

сейчас ищу аналог sed пока безрезультатно
Андрей Светлов
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
dnk8
Андрей Светлов
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
По теме не подскажете как например:
a='набор символов' # неважно каких в данном случае кирилица и пробел
a.бла_бла(' ‘, ’_') # типо заменить пробел на подчеркивание

Чем такое можно реализовать ??

Просто пока вижу реализацию так(пока малокомпитентен):
рекурсивно проходимся по директории перечисляя files dirs
for filename in files:
outfilename = filename.бла_бла('словарь кирилицы':'транслит кирилицы')
if filename != outfilename:
os.move(filename,outfilename)
Андрей Светлов
Вы уж книжку почитайте, что ли. http://diveintopython.org/ или еще что…
dnk8
Я то уж прочитаю, сечас собственно тем и занимаюсь, пройдёт недели 2-3 пока я найду и разберусь с функцией или модулем… или что своего напишу.
я оч загружен и времени почти нет разбираться… потому и спрашиваю, есть ли что-то наподобии командды sed, на замену одного символа другим, ну или по созданному словарю
Studentik
import os, os.path

mymap = {ord("a"):"!!!", ord("b"):"???"}
mytranslator = lambda name: name.translate(mymap)

for path, dirs, files in os.walk(os.getcwd()):
for d in dirs:
print(os.path.join(path,mytranslator(d)))
for f in files:
print(os.path.join(path,mytranslator(f)))
dnk8
о как,
Спасибо
ушёл читать про что такое lambda и ord

Однако приведённым скриптом получаю ошибку
Traceback (most recent call last):
File “123.py”, line 8, in <module>
print(os.path.join(path,mytranslator(d)))
File “123.py”, line 4, in <lambda>
mytranslator = lambda name: name.translate(mymap)
TypeError: expected a character buffer object
dnk8
вот наверно вопрос больше к экспертам
реализуемо ли на python типо такого консольного решения:
txt=чача
txt=${txt//ч/ch}
txt=${txt//а/a}
echo $txt
chacha

Я конечно понимаю, что python умеет работать только с битовой строкой и unicode
а если сделать так:
map = {
u'а' : 'a',
u'б' : 'b',
и т.д. перечислить все символы
}

def cyr2lat(k):
for s in k:
s = map(s)

for path, dirs, files in os.walk(os.getcwd()):
for fdir in dirs:
new_dir = cyr2lat(fdir)
if new_dir != fdir:
os.move(fdir, new_dir)
Studentik
В Python 3.1 все работает и делает именно “что-то типа такого консольного решения”
dnk8
В том то и дело что на CentOS 5.5 (rhel5) у меня нет третьего питона, там сча стоит 2.6.4

Под своим Gentoo проверил, реально на 3.1 и на 3.2 работает, на 2.6 ни на одном не заработало, сработало 1 цикл и креш питона на версии 2.7.1

import os, shutil

mapkeys = {ord(" "):"_", ord("("):"_", ord(")"):"_"}
trans = lambda name: name.translate(mapkeys)

for path, dirs, files in os.walk(os.getcwd()):
for d in dirs:
fullpath = path + "/" + d
out_path = path + "/" + trans(d)
if d != trans(d):
shutil.move( fullpath, out_path )

for f in files:
filepath = path + "/" + f
out_file = path + "/" + trans(f)
if f != trans(f):
shutil.move( filepath , out_file )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB