Форум сайта python.su
1
Хочу рассортировать файлы по расширениям и применять к ним какие-то заданные пользователем действия.
Например псевдокод:
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') – как с такими поступать?
Офлайн
1
>>> extentions =
>>> fname = ‘test.py’
>>> extention = fname
>>> extention in extentions
True
регулярные выражения для таких делов это слишком..
Офлайн
1
Вы не поняли сути моей задачи. Мне нужен не просто флаг, что расширение совпадает, мне нужно знать какому набору оно соответствует из имеющегося ансамбля. Просто делать это в цикле – простой тупой вариант, но мне нужна скорость. Потому что файлов будет очень много.
Офлайн
0
>>> exts=['py','c','h']
>>> reg=re.compile('|'.join(map(lambda x: r"(.*\.%s$)" % x, exts)))
>>> bool(reg.match("file.py"))
True
>>> bool(reg.match("file.com"))
False
Офлайн
1
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
Офлайн
1
последний вариант наверное уже близко к тому что надо, в конце концов нужно просто разделить набор расширений ‘*.c *.h’ на несколько ключей в словаре.
redixin: спасибо за наводку. сделаю примерно в таком ключе, но пооптимальнее. А вам посоветую для расширения кругозора почитать http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
Офлайн