我正在尝试使用Python重命名许多文件,以便它们遵循新的命名约定,如下所示:
~/directory/yyyy + qq + directory_name + ' Letter'.
现在,它们的格式如下:
~/directory/directory_name + yyyy + qq + ' Letter'.
例如,我有一个名为/Users/Test/rename_test/Salmon 2
的目录,并且其中包含以下文件:
/Users/Test/rename_test/Salmon 2/Salmon 2 2013 Q4 Letter.pdf
/Users/Test/rename_test/Salmon 2/Salmon 2 2018 Q1 Letter.pdf
/Users/Test/rename_test/Salmon 2/Salmon 2 2015 Q2 Letter.pdf
我想将所有这些文件重命名为:
/Users/Test/rename_test/Salmon 2/2013 Q4 Salmon 2 Letter.pdf
/Users/Test/rename_test/Salmon 2/2018 Q1 Salmon 2 Letter.pdf
/Users/Test/rename_test/Salmon 2/2015 Q2 Salmon 2 Letter.pdf
我研究过使用os.split
提取位置[-2]
和[-3]
-因为那些应该始终为 qq , yyyy -然后通过将文件移动到位置[0]
和[1]
重命名文件。但是我有数百个目录和数千个文件,因此我担心一个偏离当前约定的错字或文件可能会导致错误。
那么解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
您的想法基本上是正确的-但您可以添加至少两个步骤以使其更安全:
使用一个正则表达式来检测您的格式,如果不匹配则引发错误。例如。您的正则表达式可能如下所示:
^鲑鱼2 \ d {4} Q \ d {1}字母
您需要用一个包含您当前目录名称的变量替换Salmon 2
添加“试运行”模式-转换仅打印到标准输出-这样您就可以看到会发生什么。
无论做什么,都要先备份。
奖金:我可能会在此工作中使用pathlib及其命令-它比旧的“文件名只是字符串”方法更具接口性。
答案 1 :(得分:0)
您可以使用os.rename
或shutil
(请参阅here)。
在您的情况下,如果您的命名结构确定为您发布的内容,则可以不使用正则表达式:
import shutil
old_path = '/Users/Test/rename_test/Salmon 2/Salmon 2 2013 Q4 Letter.pdf'
x = old_path.split(os.sep)[-1].split()
x = ' '.join((x[2],x[3],x[0],x[1],x[3],x[4]))
new_path = os.sep.join(old_path.split(os.sep)[0:-1] + [x])
#shutil.move(old_path, new_path)
shutil.copyfile(old_path, new_path)
请尝试使用打印语句!
您必须使用for循环包装所有文件。最好将其复制到新目录,然后手动确认结果。
import glob
for f in glob.glob('/Users/Test/rename_test/Salmon 2/*.pdf'):
# code above, where old_path = f
这是使用复制而不是移动的另一个原因,因为如果将文件重命名为具有相同扩展名的相同目录,则每次运行代码时它们都会被拾取(并破坏上面的代码)。
答案 2 :(得分:0)
您可以尝试使用re.sub()
来执行名称操作。
例如:
import re
import os
old_path = '/Users/Test/rename_test/Salmon 2/Salmon 2 2013 Q4 Letter.pdf'
old_filename = os.path.basename(old_path) # Salmon 2 2013 Q4 Letter.pdf
directory = os.path.basename(os.path.dirname(old_path)) # Salmon 2
new_filename = re.sub(r'('+ directory +')\s([0-9]{4})\s(Q[1-9]?[0-9]*)\sLetter\.pdf',r'\2 \3 \1 Letter.pdf', old_filename) # 2013 Q4 Salmon 2 Letter.pdf
如您所见,该方法使您可以定义一个模式,在其中可以标识带有括号(...)
的组,然后可以按照自己喜欢的顺序使用这些组重新排列字符串。可以使用\n
选择每个组,其中n是组号。