2

所以我觉得我可能使用了错误的词在 Google/StackOverflow 上四处寻找代码。

我正在构建一个脚本(除其他外)将执行大量移动文件。

我目前有一条小线将文件名与扩展名分开,如果文件已存在于目录中,则添加文件名+(重复)+扩展名。

但是,我觉得必须有一个简单的小单线,基本上可以做到(重复)、(重复 1)、(重复 2)、(重复 3)等(基本上只是将第二个数字更改为下一个如果文件与当前文件存在,则编号)。

什么是我太愚蠢而无法弄清楚自己的简单解决方案?

抱歉,我没有想到我当前的代码可能会帮助人们回答我的问题!

def destination(self, f): return os.path.abspath('.')+'/'+self.filename(f)+'/'+self.filename(f)+' (Duplicate)'+self.extension(f) if and os.path.isfile(os.path.abspath('.')+'/'+self.filename(f)+'/'+f) else os.path.abspath('.')+'/'+self.filename(f)+'/'+f

我使用了一种稍微改变的方法来获取文件名和扩展名(基本上只是为了解决一些 rar 部分和一些文件夹问题)。但是'self.filename(f) 和self.extension(f) 基本上只是os.splittext(f)[0] 和os.splittext(f)[1]。

4

1 回答 1

5

当然,有一些单行代码可以做到这一点,但我想不出一个可读性很强的代码。我会去做这样的事情:

def alternative_names(filename):
    yield filename
    base, ext = os.path.splitext(filename)
    yield base + "(Duplicate)" + ext
    for i in itertools.count(1):
        yield base + "(Duplicate %i)" % i + ext

target_name = next(alt_name
                   for alt_name in alternative_names(target_name)
                   if not os.path.exists(alt_name))

(这可能基本上是你所做的,但你没有发布你的代码。)

于 2012-04-11T14:15:43.357 回答