функция Python не повторяется - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть инструмент python, чтобы «коснуться» (utime) файла, а затем переместить в другую папку. Однако, если файл уже существует в папке назначения, он автоматически перезаписывается. Я хотел бы проверить файл с таким же именем в папке назначения и, если он существует, переименовать тот, который я перемещаю, в его имя плюс '- n ' в конце, где n - это число, начинающееся с «1», а если файл с «-1» в конце уже существует, «-2» и т. д.
Например, скажем, в исходной папке есть файл 'foo.txt', но в целевой папке также есть один 'foo.txt'. Эта функция должна возвращать '(абсолютный путь) /foo-1.txt'.

Итак, я сделал функцию для проверки этих обстоятельств и возврата измененной строки, чтобы я мог позже использовать переименование и не перезаписывать. Однако в настоящее время, если файл существует, он ничего не возвращает. Ниже приведен код функции, при условии, что эти переменные:

fileName - входной путь к файлу, абсолютный путь. например /Users/foo/sourceFolder/bar.txt
index - переменная итератора, установленная в '1' в начале каждого открываемого файла (внешне для функции)

def checkExists(fileName):
    global index
    print "checkExists(" + fileName + ")"

    if exists(fileName):
        splitPath = split(newFile)
        splitName = splitext(splitPath[1])
        newSplitName = splitName[0] + "-" + str(index)

        index += 1
        newName = splitPath[0] + "/" + newSplitName + splitName[1]

        print "newName = " + newName
    else:
        print "(else) fileName = " + fileName
        print "(else) fileName = " + str(type(fileName))
        print ""
        return fileName

    checkExists(newName)

Теперь кажется, что внутренний вызов для checkExists () в конце не выполняется.

Надеюсь, я ясно объяснил.
IAmThePiGuy

P.S. Я не хочу слышать о потенциальных проблемах гонки с utime, я знаю, что файлы в исходном каталоге больше не будут доступны.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Ваша проблема в том, что если файл существует, вы ничего не возвращаете. Я думаю, что вы собираетесь использовать рекурсию для проверки нового имени файла, но вы не возвращаете результат этого вызова. Вот удар:

def checkExists(fileName, index=0):
    print "checkExists(" + fileName + ")"

    if exists(fileName):
        splitPath = split(newFile)
        splitName = splitext(splitPath[1])
        newSplitName = splitName[0] + "-" + str(index)

        index += 1
        newName = splitPath[0] + "/" + newSplitName + splitName[1]

        print "newName = " + newName
        return checkExists(newName, index)   # recurse
    else:
        print "(else) fileName = " + fileName
        print "(else) fileName = " + str(type(fileName))
        print ""
        return fileName

Я также позволил себе подвести рекурсивный вызов к генерации newName, удалить глобальную переменную и заменить ее рекурсией.

1 голос
/ 16 апреля 2011

Вот итерационный подход к аналогичной проблеме:

def copyfile(path, dstdir, verbose=True, dryrun=False):
    """Copy `path` file to `dstdir` directory incrementing name if necessary."""
    filename = os.path.basename(path)
    basename, ext = os.path.splitext(filename)

    for i in itertools.count(2):
        destpath = os.path.join(dstdir, filename)
        if not os.path.exists(destpath):
            if verbose:
                print(path, '->', destpath)
            if not dryrun:
                shutil.copyfile(path, destpath)
            return
        # increment filename
        filename = "%s_%02d%s" % (basename, i, ext)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...