bialix
Авг. 8, 2007 15:17:41
Хочу рассортировать файлы по расширениям и применять к ним какие-то заданные пользователем действия.
Например псевдокод:
actions = {'*.txt': func1,
‘*.py’: func2,
‘*.c *.h’: func3}
if filename match action in actions:
actions(filename)
Придумал, что искать совпадения удобно не перебором всех ключей словаря, а через регулярные выражения.
pat = re.compile(r'(.*\.txt$)|(.*\.py$)|(.*\.$)')
m = pat.match(filename)
if m:
index = list(m.groups()).index(filename)
actions(filename)
Выглядит немного громоздко, но работает универсально.
Дело в том, что я заранее не знаю какие будут наборы расширений. Соответственно регулярное выражение придется строить в рантайме. Внимание, вопрос: существуют ли готовые питоновые либы, чтобы им скармливать наборы расширений, а от них получать готовое регулярное расширение.
стандартная либа fnmatch умеет транслировать glob-выражения в regexp, но загвоздка с наборами нескольких масок в одной строке ('*.c *.h *.cpp *.hpp') – как с такими поступать?
redixin
Авг. 9, 2007 10:15:41
>>> extentions =
>>> fname = ‘test.py’
>>> extention = fname
>>> extention in extentions
True
регулярные выражения для таких делов это слишком..
bialix
Авг. 9, 2007 11:33:54
Вы не поняли сути моей задачи. Мне нужен не просто флаг, что расширение совпадает, мне нужно знать какому набору оно соответствует из имеющегося ансамбля. Просто делать это в цикле – простой тупой вариант, но мне нужна скорость. Потому что файлов будет очень много.
redixin
Авг. 9, 2007 13:17:20
def func1(fname):
print 'doing something with ',fname
def func2(fname):
print 'doing something other with ',fname
def do_some(filelist):
actions = {'py': func1, 'exe': func2}
for fname in filelist:
extention = fname[fname.rfind('.') + 1:]
if extention in actions.keys():
actions[extention](fname)
else:
print 'no_action'
do_some(['file.py', 'file.pyc', 'file.exe'])
doing something with file.py
no_action
doing something other with file.exe
не понимаю каким боком тут помогут регекспы..
bialix
Авг. 9, 2007 13:28:10
последний вариант наверное уже близко к тому что надо, в конце концов нужно просто разделить набор расширений ‘*.c *.h’ на несколько ключей в словаре.
redixin: спасибо за наводку. сделаю примерно в таком ключе, но пооптимальнее. А вам посоветую для расширения кругозора почитать
http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html