【问题标题】:Auto-increment file name Python自增文件名 Python
【发布时间】:2015-04-17 03:07:05
【问题描述】:

我正在尝试编写一个函数,该函数将路径名和文件名分配给基于文件夹中存在的文件名的变量。然后,如果文件名已经存在,则文件名会自动递增。我已经看到一些关于这个使用 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)

【问题讨论】:

  • 您的目标只是为了确保您拥有唯一的文件名吗?因为有更简单的方法可以做到这一点......
  • @1.618 我不认为目标是唯一的名称,而是如果您尝试保存同一个文件两次,则自动附加一个递增的索引(类似于大多数操作系统的做法,如果您这样做所以通过查找器/浏览器)
  • 它不会返回,因为您忘记了return 语句。 ;)

标签: python python-2.7


【解决方案1】:

虽然我不建议为此使用递归(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,这可能非常昂贵,尤其是当路径是网络位置时。

【讨论】:

  • 非常感谢!当然,这两种解决方案都可以完美运行。感谢您的重写效率更高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多