Форум сайта python.su
2.6.5
>>> print u"чапу".translate({ord(u'ч'): u'char1', ord(u'у'): u'char2'})
char1апchar2
>>>
Офлайн
py.user.nextСпасибо попробую. Столько нового узнал. мать ети я даж не представлял, что таки можно
2.6.5>>> print u"чапу".translate({ord(u'ч'): u'char1', ord(u'у'): u'char2'})
char1апchar2
>>>
Офлайн
я ошибся, там 2.4.3 %) буду компилить третий
Хочу словарь вынести в отдельный файл, как это сделать?
transliter.py
import os, shutil
def trnslt(name):
mapkeys = {ord(" "):"_", ord("("):"_", ord(")"):"_"} # здесь перечислить весь словарь
trans = lambda name: name.translate(mapkeys)
import os, shutil, transliter
for path, dirs, files in os.walk(os.getcwd()):
for d in dirs:
fullpath = path + "/" + d
out_path = path + "/" + transliter.trnslt(d)
if d != transliter.trnslt(d):
shutil.move( fullpath, out_path )
for f in files:
filepath = path + "/" + f
out_file = path + "/" + transliter.trnslt(f)
if f != transliter.trnslt(f):
shutil.move( filepath , out_file )
Отредактировано (Фев. 25, 2011 09:33:14)
Офлайн
Как тут у вас все непросто.
вот, что у меня получилось:
#!/usr/bin/python
# coding=utf-8
import os
translit = dict(zip(u"абвгдеёзиклмнопрстуфхьъ", "abvgdeeziklmnoprstufh'~"))
translit.update({u'ц': 'tz', u'ч': 'ch', u'ш': 'sh', u'ы': 'yi',
u'э': 'ye', u'ю': 'ju', u'я': 'ja'})
for path, dirs, files in os.walk(os.getcwd(), topdown=False):
for name in dirs + files:
translated = ''.join([translit.get(x, x) for x in name.decode('utf-8')]).encode('utf-8')
if translated != name:
os.rename(os.path.join(path, name), os.path.join(path, translated))
Офлайн
Спасибо, всё отлично…
Офлайн
Погодите. А ускорять не будем, что ли7 Устраивает скорость-то?
Офлайн
Скорость супер, и у того скрипта и у этого, меня вполне устраивает
Офлайн
Немного усовершенствовал вышеуказанный вариант.
Добавил параметры командной строки, дабы можно было указать директории источника и назначения
для копирования дерева файлов, а также изменять кодировку файловой системы.
Немного изменил таблицу транслитерации
#!/usr/bin/python
# coding=utf-8
import os
import argparse
import shutil
class Error: pass
class FolderError(Error): pass
def copytranstree (src, dst):
names = os.listdir( src )
try:
os.makedirs( dst )
except WindowsError:
pass
errors = []
for name in names:
srcname = os.path.join( src, name )
dstname = os.path.join( dst, ''.join([translit.get(x, x) for x in name.decode( input_parametres.encoding ).lower()]).encode( input_parametres.encoding ) )
try:
if os.path.isdir( srcname ):
copytranstree( srcname, dstname )
else:
shutil.copy2( srcname, dstname )
except (IOError, os.error), why:
errors.append( ( srcname, dstname, str( why ) ))
except Error, err:
errors.extend( err.args[0] )
try:
shutil.copystat( src, dst )
except WindowsError:
pass
except OSError, why:
errors.extend( (src, dst, str(why) ) )
if errors:
raise Error( errors )
parser = argparse.ArgumentParser(description='Copy directory tree with transliterated pathnames')
parser.add_argument('-e','--encoding', help='File system encoding', default='utf-8')
parser.add_argument('-s','--src', help='Source folder name', default='./' )
parser.add_argument('-d','--dst', help='Destination folder name', default='./')
input_parametres = parser.parse_args()
translit = dict(zip(u"абвгдеёзийклмнопрстуфхьъ", "abvgdeeziyklmnoprstufh'~"))
translit.update({u'ц': 'tz', u'ч': 'ch', u'ш': 'sh', u'ы': 'yi',
u'э': 'ye', u'ю': 'ju', u'я': 'ja', u' ': '_'})
src = os.path.abspath( input_parametres.src )
dst = os.path.abspath( input_parametres.dst )
if not os.path.exists( dst ):
dstname = ''.join([translit.get(x, x) for x in dst.decode( input_parametres.encoding ).lower()]).encode( input_parametres.encoding ).lower()
os.makedirs( dstname )
dst = os.path.abspath( dstname )
if not os.path.exists( src ) or os.path.isfile( dst ):
raise FolderError()
copytranstree( src, dst )
Офлайн