dnk8
Фев. 23, 2011 18:23:50
Здрасти,
имею задачу рекурсивно перетранслитировать содержимое определённой папки; файловая система utf-8
т.е. перетранслитировать содержимое папки, подпапки и их содержимое, просто сам неопытный совсем, третий день маюсь с питоном, но толкового пока ничего не выходит, весь инет перерыл, ничего подходящего не нашёл
сам я всё пишу на shell, но встала проблема со скоростью, там может быть до 400 папок с файлами под транслитерацию, а 7 сек меня не устраивает
По этому решил насесть на питон, подскажите как это можно реализовать, а если кто-то ещё и покажет как, то буду очень примного благодарен
PS
Более менее разобрался с модулями os, string, shutil
Язык понятен, в принципе очень похож на написание на bash, так что с горем пополам чуточку понимаю
Главный вопрос конечно, из за того что я линуксоид, это сопоставление определённых комманд linux с модулями питона,
естественно задача по транслитерации будет не последней и буду изучать язык дальше, т.к. запал в душу
сейчас ищу аналог sed пока безрезультатно
Андрей Светлов
Фев. 23, 2011 19:45:51
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
dnk8
Фев. 23, 2011 20:09:24
Андрей Светлов
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
По теме не подскажете как например:
a='набор символов' # неважно каких в данном случае кирилица и пробел
a.бла_бла(' ‘, ’_') # типо заменить пробел на подчеркивание
Чем такое можно реализовать ??
Просто пока вижу реализацию так(пока малокомпитентен):
рекурсивно проходимся по директории перечисляя files dirs
for filename in files:
outfilename = filename.бла_бла('словарь кирилицы':'транслит кирилицы')
if filename != outfilename:
os.move(filename,outfilename)
Андрей Светлов
Фев. 23, 2011 20:43:07
Вы уж книжку почитайте, что ли.
http://diveintopython.org/ или еще что…
dnk8
Фев. 23, 2011 21:06:58
Я то уж прочитаю, сечас собственно тем и занимаюсь, пройдёт недели 2-3 пока я найду и разберусь с функцией или модулем… или что своего напишу.
я оч загружен и времени почти нет разбираться… потому и спрашиваю, есть ли что-то наподобии командды sed, на замену одного символа другим, ну или по созданному словарю
dnk8
Фев. 24, 2011 08:26:17
о как,
Спасибо
ушёл читать про что такое 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
Фев. 24, 2011 09:09:44
вот наверно вопрос больше к экспертам
реализуемо ли на 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
Фев. 24, 2011 09:49:28
В Python 3.1 все работает и делает именно “что-то типа такого консольного решения”
dnk8
Фев. 24, 2011 20:32:20
В том то и дело что на 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 )