2012-04-11 4 views
1

Так что я чувствую, что, вероятно, я использую неправильные слова, чтобы искать код для этого в Google/StackOverflow.Переименование файлов, которые существуют с Python

Я строю сценарий, который (между прочим) будет делать много движущихся файлов.

В настоящее время у меня есть небольшая строка, чтобы разделить имя файла с расширением и добавить имя файла + (дублировать) + расширение, если файл уже существует в каталоге.

Однако, я чувствую, что существует простой маленький однострочный слой, который будет по существу делать (дублировать), (дублировать 1), (дублировать 2), (дублировать 3) и т. Д. (По сути, просто меняя эту вторую номер на следующий номер, если файл существует с текущим).

Какое простое решение я слишком глуп, чтобы понять себя?

Извините, мне не пришло в голову, что мой текущий код может помочь людям ответить на мой вопрос!

def destination(self, f): return os.path.abspath('.')+'/'+self.filename(f)+'/'+self.filename(f)+' (Duplicate)'+self.extension(f) if and os.path.isfile(os.path.abspath('.')+'/'+self.filename(f)+'/'+f) else os.path.abspath('.')+'/'+self.filename(f)+'/'+f 

Я использовал несколько измененного метод получения имени файла и расширения (по сути просто обойти некоторую Rar часть и некоторые вопросы папок). Но «self.filename (f) и self.extension (f) в основном являются просто os.splittext (f) [0] и os.splittext (f) [1].

+2

Что не-просто-достаточно решение у вас уже есть? –

+0

@ Robin Hood ** Вращение файла ** может быть термином, о котором вы говорите. В Python модуль [logging] (http://docs.python.org/library/logging.html) используется для настройки поворота файла и, следовательно, он заботится о модуле регистрации. Я нашел [this] (http://stackoverflow.com/questions/4654915/rotate-logfiles-each-time-the-application-is-started-python), который помогает настроить настройку ведения журнала (и последующего вращения файла). Непосредственно переименуйте (* или * rotate *) имена файлов *. –

+0

Прошу прощения, если я не был ясен, проблема не в том, что мое решение не достаточно простое, просто мое решение может касаться только ОДНОГО дубликата, и единственный способ, которым я могу думать, сделать это, сделать два заключается в том, чтобы просто добавить еще один блок кода, который является одним и тем же, но с «Дубликат 1», и проверяет как обычный, так и «Дубликат» - что-то, что было бы совершенно смешно, а также очень долго очень быстро и, по сути, ограниченный тем, сколько из них я решил добавить. –

ответ

4

Конечно, там есть несколько однострочных, чтобы сделать это, но я не могу придумать очень читаемый. Я бы что-то вроде этого:

def alternative_names(filename): 
    yield filename 
    base, ext = os.path.splitext(filename) 
    yield base + "(Duplicate)" + ext 
    for i in itertools.count(1): 
     yield base + "(Duplicate %i)" % i + ext 

target_name = next(alt_name 
        for alt_name in alternative_names(target_name) 
        if not os.path.exists(alt_name)) 

(Это может быть в основном то, что вы сделали, но вы не отправлял свой код.)

+0

Красивая! Agh, я должен использовать итераторы :) –

+0

@Sven Marnach Хороший код, моя единственная проблема: я не могу понять, как это сделать в коде, который я могу назвать в другом месте, и у меня есть «проверка работоспособности» (я надеюсь, что я 'm, используя этот термин правильно), чтобы убедиться, что, если путь уже существует (т. е. если файл уже находится в нужном месте), назначение должно быть одинаковым. Прямо сейчас этот код видит, что он существует и переименовывает его. –

+0

Отличный пример, спасибо. – Tamm

Смежные вопросы