如何在Python中重命名文件名的一部分

时间:2019-04-11 19:57:38

标签: python split rename glob

我正在尝试使用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]重命名文件。但是我有数百个目录和数千个文件,因此我担心一个偏离当前约定的错字或文件可能会导致错误。

那么解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

您的想法基本上是正确的-但您可以添加至少两个步骤以使其更安全:

  1. 使用一个正则表达式来检测您的格式,如果不匹配则引发错误。例如。您的正则表达式可能如下所示:

    ^鲑鱼2 \ d {4} Q \ d {1}字母

您需要用一个包含您当前目录名称的变量替换Salmon 2

  1. 添加“试运行”模式-转换仅打印到标准输出-这样您就可以看到会发生什么。

  2. 无论做什么,都要先备份。

奖金:我可能会在此工作中使用pathlib及其命令-它比旧的“文件名只是字符串”方法更具接口性。

答案 1 :(得分:0)

您可以使用os.renameshutil(请参阅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是组号。

有关更多信息:https://docs.python.org/3.6/library/re.html#re.sub