Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 13, 2013 13:12:15

alexeyvanzhula
Зарегистрирован: 2012-05-14
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

Есть строка вида file_01.ext. Нада инкрементально увеличивать\уменьшать номер.
Все это легко делается на питоне. Но меня больше интересует не существует ли подобного функционала в стандартных модулях питона, дабы не сотворять велосипедов? Просто планируется очень часто использовать сию функцию.

Отредактировано alexeyvanzhula (Фев. 13, 2013 13:13:13)

Офлайн

#2 Фев. 13, 2013 17:10:29

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

форматирование? велосипед?

for n in range(66):
    print('file_{:0>2}.ext'.format(n))

Офлайн

#3 Фев. 13, 2013 20:50:52

alexeyvanzhula
Зарегистрирован: 2012-05-14
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Так что кусок кода явно должен быть побольше. Какие варианты можете предложить? - скорость выполнения критична.

Офлайн

#4 Фев. 13, 2013 21:08:34

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

Извлекайте номер регулярным выражением. Стандартнее думаю ничего нет.



Офлайн

#5 Фев. 13, 2013 21:29:31

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

alexeyvanzhula
Нада инкрементально увеличивать\уменьшать номер.
alexeyvanzhula
не обязательно с номером

Офлайн

#6 Фев. 13, 2013 21:29:57

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

Регулярные выражения подойдут. Можно примерно так:

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 может быть любое и не обязательно с номером и необязательно с расширением.
Тогда нужно проверить, есть ли номер, если есть увеличить, если нет добавить, предварительно разбив имя и расширение (при необходимости).

Отредактировано reclosedev (Фев. 13, 2013 21:33:32)

Офлайн

#7 Фев. 13, 2013 21:34:44

alexeyvanzhula
Зарегистрирован: 2012-05-14
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

sergeek

имеется ввиду, например, вызов функции с именем file.ext и возврат file1.ext

Офлайн

#8 Фев. 13, 2013 21:38:06

alexeyvanzhula
Зарегистрирован: 2012-05-14
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

reclosedev
Регулярные выражения подойдут. Можно примерно так:

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

А так спасиба попробую. Пора уже с регекспами разбираться.

Офлайн

#9 Фев. 13, 2013 21:51:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

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)
Универсальную функцию написать сложно, потому что не знаю какие могут быть варианты имен, так что подстраивайте под себя.

Офлайн

#10 Фев. 13, 2013 21:52:59

alexeyvanzhula
Зарегистрирован: 2012-05-14
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

инкрементальное увеличение номера в сроке

reclosedev

Большое спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version