Форум сайта python.su
Хочу рассортировать файлы по расширениям и применять к ним какие-то заданные пользователем действия.
Например псевдокод:
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') – как с такими поступать?
Офлайн
>>> extentions =
>>> fname = ‘test.py’
>>> extention = fname
>>> extention in extentions
True
регулярные выражения для таких делов это слишком..
Офлайн
Вы не поняли сути моей задачи. Мне нужен не просто флаг, что расширение совпадает, мне нужно знать какому набору оно соответствует из имеющегося ансамбля. Просто делать это в цикле – простой тупой вариант, но мне нужна скорость. Потому что файлов будет очень много.
Офлайн
>>> 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
Офлайн
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
Офлайн
последний вариант наверное уже близко к тому что надо, в конце концов нужно просто разделить набор расширений ‘*.c *.h’ на несколько ключей в словаре.
redixin: спасибо за наводку. сделаю примерно в таком ключе, но пооптимальнее. А вам посоветую для расширения кругозора почитать http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
Офлайн