Найти - Пользователи
Полная версия: инкрементальное увеличение номера в сроке
Начало » Python для новичков » инкрементальное увеличение номера в сроке
1 2
alexeyvanzhula
Есть строка вида file_01.ext. Нада инкрементально увеличивать\уменьшать номер.
Все это легко делается на питоне. Но меня больше интересует не существует ли подобного функционала в стандартных модулях питона, дабы не сотворять велосипедов? Просто планируется очень часто использовать сию функцию.
sergeek
форматирование? велосипед?
for n in range(66):
    print('file_{:0>2}.ext'.format(n))
alexeyvanzhula
Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Так что кусок кода явно должен быть побольше. Какие варианты можете предложить? - скорость выполнения критична.
Soteric
Извлекайте номер регулярным выражением. Стандартнее думаю ничего нет.
sergeek
alexeyvanzhula
Нада инкрементально увеличивать\уменьшать номер.
alexeyvanzhula
не обязательно с номером
reclosedev
Регулярные выражения подойдут. Можно примерно так:
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)

upd: поздно заметил.
alexeyvanzhula
Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Тогда нужно проверить, есть ли номер, если есть увеличить, если нет добавить, предварительно разбив имя и расширение (при необходимости).
alexeyvanzhula
sergeek

имеется ввиду, например, вызов функции с именем file.ext и возврат file1.ext
alexeyvanzhula
reclosedev
Регулярные выражения подойдут. Можно примерно так:

я не шарю в регулярных выражениях. Оно будет работать с строкой типа file234abc_1.exe?
То есть не затрагивать номер не вконце имени (234).

А так спасиба попробую. Пора уже с регекспами разбираться.
reclosedev
alexeyvanzhula
Оно будет работать с строкой типа file234abc_1.exe?
Да. Но чтобы “file234abc.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)
Универсальную функцию написать сложно, потому что не знаю какие могут быть варианты имен, так что подстраивайте под себя.
alexeyvanzhula
reclosedev

Большое спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB