我正在尝试编写一个函数,将路径名和文件名分配给一个变量,该变量基于文件名中存在的文件名。然后,如果文件的名称已存在,则文件名将自动递增。我已经在使用while循环看到了一些帖子,但是我无法理解这一点,并希望将其包装在递归函数中。
这是我到目前为止所拥有的。使用print语句进行测试时,每个都很有效。但它不会将新名称返回主程序。
def checkfile(ii, new_name,old_name):
if not os.path.exists(new_name):
return new_name
if os.path.exists(new_name):
ii+=1
new_name = os.path.join(os.path.split(old_name)[0],str(ii) + 'snap_'+ os.path.split(old_name)[1])
print new_name
old_name = “D:\Bar\foo”
new_name= os.path.join(os.path.split(old_name)[0],”output_” + os.path.split(old_name)[1])
checkfile(0,new_name,old_name)
答案 0 :(得分:5)
虽然我不建议使用递归(python的堆栈最大约1000个函数调用深度),但你只是错过了递归位的返回:
new_name= os.path.join(os.path.split(old_name)[0],”output_” + os.path.split(old_name)[1])
checkfile(0,new_name,old_name)
应改为:
new_name= os.path.join(os.path.split(old_name)[0],”output_” + os.path.split(old_name)[1])
return checkfile(ii,new_name,old_name)
但实际上,你可以通过将其重写为:
来使这更简单 def checkfile(path):
path = os.path.expanduser(path)
if not os.path.exists(path):
return path
root, ext = os.path.splitext(os.path.expanduser(path))
dir = os.path.dirname(root)
fname = os.path.basename(root)
candidate = fname+ext
index = 0
ls = set(os.listdir(dir))
while candidate in ls:
candidate = "{}_{}{}".format(fname,index,ext)
index += 1
return os.path.join(dir,candidate)
此表单还处理文件名具有扩展名的事实,原始代码并非如此,至少不是很清楚。它还可以避免不必要的os.path.exist
,这可能非常昂贵,特别是如果路径是网络位置。