2012-04-11 132 views
1

所以我觉得我可能在Google/StackOverflow中使用了错误的单词来寻找代码。重命名Python中存在的文件

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

我目前有一条小线来分割扩展名的文件名,并添加文件名+(重复)+扩展名,如果文件已经存在于目录中。然而,我觉得那里必须是一个简单的小单线程,它基本上会做(复制),(复制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]。

+2

有什么不-简单的解决方案够你已经有了? – 2012-04-11 14:13:07

+0

@Robin Hood **文件旋转**可能是您所指的术语。在Python中,[logging](http://docs.python.org/library/logging.html)模块用于设置文件旋转,因此它由日志记录模块处理。我发现[this](http://stackoverflow.com/questions/4654915/rotate-logfiles-each-time-the-application-is-started-python)有助于设置日志记录(以及随后的文件旋转)配置。不知道有关* 1 *班轮手动重命名(或*旋转*)文件名。 – 2012-04-11 14:28:44

+0

如果我不清楚,我很抱歉,问题不在于我的解决方案不够简单,而只是我的解决方案只能处理一个重复的问题,而且我唯一能想到的解决方法就是做两个基本上只是添加另一个相同的代码块,但与'重复1'相同,并检查常规和'重复' - 这将是完全荒谬的,也很快很快,并且基本上最终会成为受到我决定添加的人数的限制。 – 2012-04-11 14:38:20

回答

4

当然,有一些单线要做到这一点,但我想不出一个非常可读的。我会去这样的事情:

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)) 

(这可能主要是你做了什么,而是你没有发布您的代码。)

+0

美丽!唉,我必须使用迭代器:) – 2012-04-11 14:23:22

+0

@Sven Marnach不错的代码,我唯一的问题是我无法弄清楚如何把它放到一个代码中,我可以调用其他地方,并有一个“理智检查”(我希望我如果路径已经存在(即文件已经在正确的位置),那么目的地应该是相同的。现在这段代码看到它存在并重新命名它...... – 2012-04-12 10:13:43

+0

很好的例子,谢谢。 – Tamm 2012-11-26 15:43:51