我有一个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的潜在竞争问题,我知道其他任何东西都不会访问源目录中的文件。
答案 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)