我的python脚本以递归方式重命名文件,但失败了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的python脚本以递归方式重命名文件,但失败了相关的知识,希望对你有一定的参考价值。

我试图递归重命名目录中的文件,所以我编写了一个python脚本来处理重命名。所以理想情况下,脚本应该能够解决这个问题

Nicholass-MacBook-Air-2:RenameXtalTest nick$ ls
RM01_03_000_0213_Proj1_Clon1_RC_0000RC000870_010_171222_01_03_02_E0_00_031_001_RAI.jpg
RM01_03_000_0213_Proj1_Clon1_RC_0000RC000870_010_171222_07_07_01_E0_99_031_001_RAI.jpg
rename.py

Nicholass-MacBook-Air-2:RenameXtalTest nick$ ls
RC000870-C1_02-E0_00.jpg
RC000870-G7_01-E0_99.jpg
rename.py

我可以使用rename.py来处理Python中的单个名称,如果它看起来像这样:

#!/usr/bin/python
oldname = 'RM01_03_000_0213_Proj1_Clon1_RC_0000RC000870_010_171222_01_03_02_E0_00_031_001_RAI.jpg'  #manually set an old name
rowdic = {"01" : "A", "02" : "B", "03" : "C", "04" : "D", "05" : "E", "06" : "F", "07" : "G", "08" : "H"} #dictionary to translate oldname char 59 to 61
coldic = {"01" : "1", "02" : "2", "03" : "3", "04" : "4", "05" : "5", "06" : "6", "07" : "7", "08" : "8", "09" : "9", "10" : "10", "11" : "11", "12" : "12"} #dictionary to translate oldname char 56 to 58
subwdic = {"01" : "1", "02" : "2", "03" : "3"} #dictionary to translate oldname char 62 to 64

newname = oldname[36:44]+"-"+rowdic[oldname[59:61]]+coldic[oldname[56:58]]+"_"+subwdic[oldname[62:64]]+"-"+oldname[65:70]+".jpg" #definition for how to shorten, rearrange, and swap out some parts of oldname

print newname

但是一旦我尝试让脚本在Unix上处理多个文件 - 它就失败了。这是我在前面提到的脚本尝试:

#!/usr/bin/python
import os
rowdic = {"01" : "A", "02" : "B", "03" : "C", "04" : "D", "05" : "E", "06" : "F", "07" : "G", "08" : "H"} #dictionary to translate oldname char 59 to 61
coldic = {"01" : "1", "02" : "2", "03" : "3", "04" : "4", "05" : "5", "06" : "6", "07" : "7", "08" : "8", "09" : "9", "10" : "10", "11" : "11", "12" : "12"} #dictionary to translate oldname char 56 to 58
subwdic = {"01" : "1", "02" : "2", "03" : "3"} #dictionary to translate oldname char 62 to 64
for oldname in os.listdir("."): #get list of all oldnames in current directory
    newname = oldname[36:44]+"-"+rowdic[oldname[59:61]]+coldic[oldname[56:58]]+"_"+subwdic[oldname[62:64]]+"-"+oldname[65:70]+".jpg" #definition for how to shorten, rearrange, and swap out some parts of oldname
    os.rename(oldname, newname) #command to change all old names to new names

这是我尝试运行它时得到的错误:

Nicholass-MacBook-Air-2:RenameXtalTest nick$ ./rename.py 
Traceback (most recent call last):
  File "./rename.py", line 7, in <module>
    newname = oldname[36:44]+"-"+rowdic[oldname[59:61]]+coldic[oldname[56:58]]+"_"+subwdic[oldname[62:64]]+"-"+oldname[65:70]+".jpg"
KeyError: ''

有人可以帮助我理解错误的含义,以及我可以做些什么来解决它?

答案

@mooiamaduck和我的评论组合给出了这段代码:

for oldname in os.listdir("."):
    if len(oldname) < 70:
        continue 
    newname = oldname[36:44]+"-"+rowdic[oldname[59:61]]+coldic[oldname[56:58]]+"_"+subwdic[oldname[62:64]]+"-"+oldname[65:70]+".jpg"
    os.rename(oldname, newname) #command to change all old names to new names

问题基本上是您还处理没有您要重命名的特定文件名格式的文件。 (例如你的...rename.py。)例如oldname[62:64]然后翻译成一个空字符串,然后你将用它作为你的subwdic的关键字,导致空字符串KeyError

这里提出的简单修复是仅考虑至少包含70个字符的文件名。当然,更好的解决方案是对文件名进行适当的检查,看它是否与您的模式匹配,但这对您的特定用例来说会很好。

以上是关于我的python脚本以递归方式重命名文件,但失败了的主要内容,如果未能解决你的问题,请参考以下文章

PHP函数重命名失败“没有这样的文件或目录”...

使用 Powershell 递归重命名文件

递归重命名文件 Mac OSX

PowerShell重命名文件夹中的文件For循环错误

重命名项目/工作区后,出现多个“未声明的标识符”错误——但构建良好

使用python重命名文件夹中的文件名列表