Форум сайта python.su
0
Есть строка вида file_01.ext. Нада инкрементально увеличивать\уменьшать номер.
Все это легко делается на питоне. Но меня больше интересует не существует ли подобного функционала в стандартных модулях питона, дабы не сотворять велосипедов? Просто планируется очень часто использовать сию функцию.
Отредактировано alexeyvanzhula (Фев. 13, 2013 13:13:13)
Офлайн
43
форматирование? велосипед?
for n in range(66): print('file_{:0>2}.ext'.format(n))
Офлайн
0
Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Так что кусок кода явно должен быть побольше. Какие варианты можете предложить? - скорость выполнения критична.
Офлайн
20
Извлекайте номер регулярным выражением. Стандартнее думаю ничего нет.
Офлайн
43
alexeyvanzhula
Нада инкрементально увеличивать\уменьшать номер.
alexeyvanzhula
не обязательно с номером
Офлайн
173
Регулярные выражения подойдут. Можно примерно так:
import re def inc_file_number(name, value=1, re_number=re.compile("(\d+)(?=[^\d]*$)")): def replacement(m): number_string = m.group(1) fmt = "%%.%dd" % len(number_string) return fmt % (int(number_string) + value) return re_number.sub(replacement, name) names = ["1file_1.txt", "asdf_03.avi", "qwer_015.dat", "3file_01.txt"] for name in names: print name, inc_file_number(name)
alexeyvanzhulaЕсли файлов действительно много, и у них одинаковый паттерн, можно упростить и ускорить функцию:
скорость выполнения критична.
def inc_file_number2(name, value=1, re_number=re.compile("(\d\d)(?=[^\d]*$)")): return re_number.sub(lambda m: "%.2d" % (int(m.group(1)) + value), name)
alexeyvanzhulaТогда нужно проверить, есть ли номер, если есть увеличить, если нет добавить, предварительно разбив имя и расширение (при необходимости).
Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Отредактировано reclosedev (Фев. 13, 2013 21:33:32)
Офлайн
0
sergeek
Офлайн
0
reclosedev
Регулярные выражения подойдут. Можно примерно так:
Офлайн
173
alexeyvanzhulaДа. Но чтобы “file234abc.exe” воспринимало правильно нужно добавить условие, что номер может быть только перед расширением.
Оно будет работать с строкой типа file234abc_1.exe?
import re import os def inc_file_number(name, value=1, re_number=re.compile("(\d+)(?=\.[^\d]*$)")): def replacement(m): number_string = m.group(1) fmt = "%%.%dd" % len(number_string) return fmt % (int(number_string) + value) new_name, nreplacements = re_number.subn(replacement, name) if nreplacements: return new_name name, ext = os.path.splitext(name) return "%s%d%s" % (name, value, ext) names = ["1file_1.txt", "asdf_03.avi", "qwer_015.dat", "3file_01.txt", "zxcv.ext", "qwer", "file234abc_1.exe", "file234abc.exe"] for name in names: print name, inc_file_number(name)
Офлайн
0
reclosedev
Офлайн