Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2011 18:23:50

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

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

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

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

сейчас ищу аналог sed пока безрезультатно



Отредактировано (Фев. 23, 2011 18:56:09)

Офлайн

#2 Фев. 23, 2011 19:45:51

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рекурсивный транслит директории

sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой



Офлайн

#3 Фев. 23, 2011 20:09:24

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

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

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

Просто пока вижу реализацию так(пока малокомпитентен):
рекурсивно проходимся по директории перечисляя files dirs
for filename in files:
outfilename = filename.бла_бла('словарь кирилицы':'транслит кирилицы')
if filename != outfilename:
os.move(filename,outfilename)



Отредактировано (Фев. 23, 2011 20:12:44)

Офлайн

#4 Фев. 23, 2011 20:43:07

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рекурсивный транслит директории

Вы уж книжку почитайте, что ли. http://diveintopython.org/ или еще что…



Офлайн

#5 Фев. 23, 2011 21:06:58

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

Я то уж прочитаю, сечас собственно тем и занимаюсь, пройдёт недели 2-3 пока я найду и разберусь с функцией или модулем… или что своего напишу.
я оч загружен и времени почти нет разбираться… потому и спрашиваю, есть ли что-то наподобии командды sed, на замену одного символа другим, ну или по созданному словарю



Офлайн

#6 Фев. 23, 2011 21:38:18

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

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)))



Офлайн

#7 Фев. 24, 2011 08:26:17

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

о как,
Спасибо
ушёл читать про что такое 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



Отредактировано (Фев. 24, 2011 08:45:53)

Офлайн

#8 Фев. 24, 2011 09:09:44

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

вот наверно вопрос больше к экспертам
реализуемо ли на 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)



Отредактировано (Фев. 24, 2011 09:41:57)

Офлайн

#9 Фев. 24, 2011 09:49:28

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

В Python 3.1 все работает и делает именно “что-то типа такого консольного решения”



Офлайн

#10 Фев. 24, 2011 20:32:20

dnk8
От:
Зарегистрирован: 2011-02-22
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный транслит директории

В том то и дело что на 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 )



Отредактировано (Фев. 24, 2011 21:15:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version