【问题标题】:Renaming set of files when old names conflict with new names in Python3当旧名称与 Python3 中的新名称冲突时重命名文件集
【发布时间】:2018-01-13 01:33:12
【问题描述】:

假设我有一个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)

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

【问题讨论】:

  • 只要坚持不懈和努力工作,您可能会解决这个问题。

标签: python python-3.x rename filenames pathlib


【解决方案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

【讨论】:

  • 等等...我遇到了这个问题。对于像 [(A,B),(B,A)] 这样 A 和 B 都存在的东西......循环永远不会退出。一般来说,如果有一个封闭的重命名“链”,就会发生这种情况。
  • 这是一个好点;它看起来像是一个非常狭窄的边缘情况,因为它仅限于寻求交换名称的对,或者更糟的是,围绕 (ab,bc,ca) 循环名称。也许扩展重新入队逻辑,以便它现在将文件重命名为临时随机文件名,并将这个新的 tempname-> 所需的名称对放在队列中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多