python函数不重复

时间:2011-04-16 01:55:48

标签: python function

我有一个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 个答案:

答案 0 :(得分:2)

您的问题是,如果文件存在,则不返回任何内容。我认为您打算使用递归来检查新文件名,但是您不会返回该调用的结果。这是一个刺:

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 :(得分:1)

这是解决类似问题的迭代方法:

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)