Форум сайта python.su
Здрасти,
имею задачу рекурсивно перетранслитировать содержимое определённой папки; файловая система utf-8
т.е. перетранслитировать содержимое папки, подпапки и их содержимое, просто сам неопытный совсем, третий день маюсь с питоном, но толкового пока ничего не выходит, весь инет перерыл, ничего подходящего не нашёл
сам я всё пишу на shell, но встала проблема со скоростью, там может быть до 400 папок с файлами под транслитерацию, а 7 сек меня не устраивает
По этому решил насесть на питон, подскажите как это можно реализовать, а если кто-то ещё и покажет как, то буду очень примного благодарен
PS
Более менее разобрался с модулями os, string, shutil
Язык понятен, в принципе очень похож на написание на bash, так что с горем пополам чуточку понимаю
Главный вопрос конечно, из за того что я линуксоид, это сопоставление определённых комманд linux с модулями питона,
естественно задача по транслитерации будет не последней и буду изучать язык дальше, т.к. запал в душу
сейчас ищу аналог sed пока безрезультатно
Отредактировано (Фев. 23, 2011 18:56:09)
Офлайн
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
Офлайн
Андрей СветловПо теме не подскажете как например:
sed - это мегаинструмент. В Питоне эта работа тоже делается не одной командой
Отредактировано (Фев. 23, 2011 20:12:44)
Офлайн
Вы уж книжку почитайте, что ли. http://diveintopython.org/ или еще что…
Офлайн
Я то уж прочитаю, сечас собственно тем и занимаюсь, пройдёт недели 2-3 пока я найду и разберусь с функцией или модулем… или что своего напишу.
я оч загружен и времени почти нет разбираться… потому и спрашиваю, есть ли что-то наподобии командды sed, на замену одного символа другим, ну или по созданному словарю
Офлайн
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)))
Офлайн
о как,
Спасибо
ушёл читать про что такое 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)
Офлайн
вот наверно вопрос больше к экспертам
реализуемо ли на 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)
Офлайн
В Python 3.1 все работает и делает именно “что-то типа такого консольного решения”
Офлайн
В том то и дело что на 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)
Офлайн