0

假设我有一个set文件重命名操作:

renames={(current_1,new_1),(current_2,new_2),...}

保证文件current_1,current_2,...存在并且新文件new_1,new_2,...是唯一的。所有文件都是pathlib.Path.

然而,它们可能是当前被命名为另一个文件的文件,必须重命名:即它可能存在current_i==new_j.

什么是实现重命名操作的优雅方式?请注意,我不能只迭代renames并重命名每个文件,因为我必须为新名称与尚未重命名的文件的名称冲突的情况做好准备。

我正在专门寻找 Python3 中的实现,并且我希望将重命名保留为set上面的形式。

一种简单的方法是临时为文件添加前缀:

temporal_prefix="a big string guaranteed not to appear in file names"
for current,new in renames:
    current.rename(current.with_name(temporal_prefix+current.name))
for current,new in renames:
    current.with_name(temporal_prefix+current.name).rename(new)

但这不是很优雅,它需要两倍的文件操作。找到一个好的前缀本身可能是一个问题。是否可以使用最少数量的文件操作在一个循环中执行此操作?

4

1 回答 1

1

尝试太聪明没有多大意义,因为重命名不是一项昂贵的操作,而且当文件存在时您得到的错误非常清楚,可以被捕获和处理。您甚至可以先测试每个文件是否存在,如果您愿意,可以避免捕获错误,但如果您认为大多数文件不会有问题,那可能是浪费时间

只需使用像队列这样的数据结构来保存您的重命名,开始从头到尾处理它们,并在发现由于存在而失败时,将重命名放回队列的末尾,以便您的循环稍后再次出现。大多数重命名可能会在第一次成功,那些不可能会在第二次成功

我没有发布任何示例代码,因为我一生中从未接触过 python(对不起)。在伪代码中我会:

While(renameQueue.hasItems)
  to_rename = renameQueue.dequeue()
  Try
    File.Rename(to_rename.oldName, to-rename.newName)
  OnError FILE_EXISTS
    new_name = system.getRandomTempFilename()
    File.Rename(to_rename.oldName, new_name)
    to_rename.oldName = new_name
    renameQueue.enqueue(to_rename)
  End Try
End While
于 2017-08-05T04:36:03.980 回答