Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2011 05:59:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9751
Репутация: +  843  -
Профиль   Отправить e-mail  

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

2.6.5

>>> print u"чапу".translate({ord(u'ч'): u'char1', ord(u'у'): u'char2'})
char1апchar2
>>>



Офлайн

#2 Фев. 25, 2011 08:19:57

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

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

py.user.next
2.6.5
>>> print u"чапу".translate({ord(u'ч'): u'char1', ord(u'у'): u'char2'})
char1апchar2
>>>
Спасибо попробую. Столько нового узнал. мать ети я даж не представлял, что таки можно



Офлайн

#3 Фев. 25, 2011 08:25:12

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

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

я ошибся, там 2.4.3 %) буду компилить третий

Хочу словарь вынести в отдельный файл, как это сделать?

transliter.py

import os, shutil

def trnslt(name):
mapkeys = {ord(" "):"_", ord("("):"_", ord(")"):"_"} # здесь перечислить весь словарь
trans = lambda name: name.translate(mapkeys)
recursiv_translit.py
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)

Офлайн

#4 Фев. 26, 2011 20:21:20

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

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

Как тут у вас все непросто.
вот, что у меня получилось:

#!/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))
Попробовал на RHEL5 с python 2.4.3 - работает.

По крайней мере вот такую структуру:
./гы
./гы/гы2
./гы/ды
./гы/ды/ды2
./гы/ды/зы
./гы/ды/зы/зы2
./гы/ды/зы/зы1
./гы/ды/ды1
./гы/гы1

Этот скрипт перекодировал в такую:
./gyi
./gyi/gyi1
./gyi/gyi2
./gyi/dyi
./gyi/dyi/zyi
./gyi/dyi/zyi/zyi2
./gyi/dyi/zyi/zyi1
./gyi/dyi/dyi1
./gyi/dyi/dyi2



Офлайн

#5 Фев. 28, 2011 09:19:26

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

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

Спасибо, всё отлично…



Офлайн

#6 Фев. 28, 2011 09:26:22

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

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

Погодите. А ускорять не будем, что ли7 Устраивает скорость-то?



Офлайн

#7 Фев. 28, 2011 10:14:12

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

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

Скорость супер, и у того скрипта и у этого, меня вполне устраивает



Офлайн

#8 Апрель 21, 2011 05:09:42

d4rk5eed
От:
Зарегистрирован: 2011-04-21
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Немного усовершенствовал вышеуказанный вариант.
Добавил параметры командной строки, дабы можно было указать директории источника и назначения
для копирования дерева файлов, а также изменять кодировку файловой системы.
Немного изменил таблицу транслитерации

#!/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 )
Я новичок в пайтоне, поэтому буду рад любым комментариям по улучшению производительности и структуры.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version