如何使用 Python 递归重命名多个文件?


在 Python 中递归重命名多个文件可能是一项有用的任务,当需要更改目录及其子目录中多个文件的名称时,这很有帮助。如果您需要替换某些字符、添加前缀或后缀或完全更改文件名,Python 拥有强大的工具来完成此类操作。在本文中,我们探讨了几种使用 Python 递归重命名多个文件的方法。我们考虑了一些代码示例,每个示例都演示了一种独特的方法来完成此任务。因此,让我们立即开始,轻松学习如何递归重命名多个文件。

利用 os.walk() 遍历目录树

os 模块中的 os.walk() 函数用于遍历目录树并访问其中的文件和目录。我们利用此函数迭代目录及其子目录中的所有文件并执行重命名操作。让我们考虑一个示例,该示例演示了如何使用 os.walk() 递归重命名多个文件。

示例

  • 我们首先定义一个名为 rename_files_recursively 的函数,它接受三个参数:directory、old_name 和 new_name。这些参数指示目录路径、要重命名的文件的旧名称以及将替换旧名称的新名称。

  • 在函数内部,我们使用 os.walk() 函数迭代给定目录及其子目录中的所有文件和目录。该函数为每次迭代输出三个值:根目录、目录列表和文件列表。

  • 然后,我们迭代 files 列表并检查文件名中是否存在 old_name。

  • 如果找到 old_name,我们使用 os.path.join(root, file) 生成文件的完整路径。我们还使用 replace() 方法创建新的文件路径,将 old_name 替换为 new_name。

  • 最后,我们使用 os.rename() 函数通过将其从原始路径移动到新路径来重命名文件。

  • 此方法允许我们递归遍历目录树并重命名在指定目录及其子目录中找到的所有匹配文件。

import os

def rename_files_recursively(directory, old_name, new_name):
    for root, dirs, files in os.walk(directory):
        for file in files:
            if old_name in file:
                file_path = os.path.join(root, file)
                new_file_path = os.path.join(root, 
file.replace(old_name, new_name))
                os.rename(file_path, new_file_path)

# Example usage
rename_files_recursively('/path/to/directory', 
'old_name', 'new_name')

利用 pathlib.Path.glob() 方法查找文件

递归重命名多个文件的另一种方法是使用 pathlib 模块中的 glob() 方法。glob() 方法允许我们根据特定模式或条件查找文件。通过将其与执行递归搜索的 rglob() 方法一起使用,我们可以轻松地定位和重命名多个文件。这是一个演示此方法的示例。

示例

  • 首先,我们定义一个名为 rename_files_recursively 的函数,它与先前方法中的参数相同:directory、`old_name 和 new_name`。

  • 在函数内部,我们使用声明的目录路径创建一个 Path 对象。

  • 然后,我们使用 rglob('*') 方法递归迭代指定目录及其子目录中的所有文件和目录。

  • 对于找到的每个 file_path,我们检查它是否为文件 (file_path.is_file()) 以及文件名中是否存在 old_name。

  • 如果满足条件,我们使用 replace() 方法和 Path 对象的 with_name() 方法构造新的文件路径,将 old_name 替换为 new_name。

  • 最后,我们使用 Path 对象的 rename() 方法重命名文件,传入新的文件路径。

此方法提供了一种紧凑且高效的方式,可以使用 pathlib 模块中的 glob() 和 rglob() 方法递归定位和重命名多个文件。

from pathlib import Path

def rename_files_recursively(directory, old_name, new_name):
    path = Path(directory)
    for file_path in path.rglob('*'):
        if file_path.is_file() and old_name in file_path.name:
            new_file_path = 
file_path.with_name(file_path.name.replace(old_name, new_name))
            file_path.rename(new_file_path)

# Example usage
rename_files_recursively('/path/to/directory', 
'old_name', 'new_name')

示例

这里,定义了一个函数 rename_files_recursively,它接受两个参数:folder_path,它是文件所在的文件夹的路径;new_prefix,是要添加到文件名中的新前缀。该函数利用 os.walk() 方法递归遍历文件夹及其子目录。然后,它使用 os.rename() 函数通过将新前缀附加到其原始名称来重命名每个文件。

import os

def rename_files_recursively(folder_path, new_prefix):
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_path = os.path.join(root, file)
            file_dir, file_name = os.path.split(file_path)
            new_name = new_prefix + file_name
            new_path = os.path.join(file_dir, new_name)
            os.rename(file_path, new_path)

# Usage
rename_files_recursively('/path/to/folder', 'new_prefix_')

示例

在此代码中,我们有一个函数 rename_files_recursively,它接受三个参数:folder_path 是文件所在的文件夹的路径,search_string 是要替换文件名中的字符串,replace_string 是替换 search string 的字符串。该函数遍历文件夹及其子目录,对于每个文件,它都会检查文件名中是否存在 search string。如果存在,它会使用 replace() 方法将 search string 替换为 replace string,并使用 os.rename() 重命名文件。

import os

def rename_files_recursively(folder_path, search_string, 
replace_string):
   for root, dirs, files in os.walk(folder_path):
      for file in files:
         if search_string in file:
            file_path = os.path.join(root, file)
            new_name = file.replace(search_string, 
replace_string)
            new_path = os.path.join(root, new_name)
            os.rename(file_path, new_path)

# Usage
rename_files_recursively('/path/to/folder', 'old_string', 'new_string')

在本文中,我们探讨了一些使用 Python 递归重命名多个文件的方法。通过使用 os.walk() 函数以及 pathlib 模块中的 glob() 和 rglob() 方法,我们可以轻松遍历目录树,找到所需的文件,并根据特定条件重命名它们。在一个示例中,您为每个文件名添加一个新前缀,而在另一个示例中,我们对文件名执行搜索和替换操作。这两个示例都利用了 Python 的 os 模块的功能来与文件系统交互,并以递归方式高效地重命名文件。

如果您需要执行批量重命名任务或修改文件名以符合特定命名约定,Python 提供了广泛的强大工具来有效地完成这些任务。通过本文获得的知识,您可以自信地在 Python 项目中操作文件名并有效地组织您的文件。

更新于: 2023年7月25日

3K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告