Python 脚本-批量重命名指定目录中的一组文件,并更改其扩展名

目录

Python 实现代码

Python 详细解释

1. 导入模块:

2. batch_rename 函数:

3.get_parser 函数: 

4. main 函数: 

5.如何从终端运行脚本

6.示例


Python 实现代码



# just checking
__author__ = "Xin Fan"
__version__ = "1.0"

import argparse
import os


def batch_rename(work_dir, old_ext, new_ext):
    """
    This will batch rename a group of files in a given directory,
    once you pass the current and new extensions
    """
    # files = os.listdir(work_dir)
    for filename in os.listdir(work_dir):
        # Get the file extension
        split_file = os.path.splitext(filename)
        # Unpack tuple element
        root_name, file_ext = split_file
        # Start of the logic to check the file extensions, if old_ext = file_ext
        if old_ext == file_ext:
            # Returns changed name of the file with new extention
            newfile = root_name + new_ext

            # Write the files
            os.rename(os.path.join(work_dir, filename), os.path.join(work_dir, newfile))
    print("rename is done!")
    print(os.listdir(work_dir))


def get_parser():
    parser = argparse.ArgumentParser(
        description="change extension of files in a working directory"
    )
    parser.add_argument(
        "work_dir",
        metavar="WORK_DIR",
        type=str,
        nargs=1,
        help="the directory where to change extension",
    )
    parser.add_argument(
        "old_ext", metavar="OLD_EXT", type=str, nargs=1, help="old extension"
    )
    parser.add_argument(
        "new_ext", metavar="NEW_EXT", type=str, nargs=1, help="new extension"
    )
    return parser


def main():
    """
    This will be called if the script is directly invoked.
    """
    # adding command line argument
    parser = get_parser()
    args = vars(parser.parse_args())

    # Set the variable work_dir with the first argument passed
    work_dir = args["work_dir"][0]
    # Set the variable old_ext with the second argument passed
    old_ext = args["old_ext"][0]
    if old_ext and old_ext[0] != ".":
        old_ext = "." + old_ext
    # Set the variable new_ext with the third argument passed
    new_ext = args["new_ext"][0]
    if new_ext and new_ext[0] != ".":
        new_ext = "." + new_ext

    batch_rename(work_dir, old_ext, new_ext)


if __name__ == "__main__":
    main()

Python 详细解释

1. 导入模块:

import argparse
import os
  • import argparse: 这个模块用于创建脚本的命令行接口,允许用户通过命令行传递参数(例如,工作目录、旧扩展名、新扩展名)。

  • import os: 这个模块提供了与操作系统交互的函数,比如列出目录中的文件 (os.listdir) 和重命名文件 (os.rename)。

  • 2. batch_rename 函数:

    def batch_rename(work_dir, old_ext, new_ext):
        """
        这个函数批量重命名给定目录中的一组文件,
        你需要传入旧的扩展名和新的扩展名
        """
        for filename in os.listdir(work_dir):
            split_file = os.path.splitext(filename)
            root_name, file_ext = split_file
            if old_ext == file_ext:
                newfile = root_name + new_ext
                os.rename(os.path.join(work_dir, filename), os.path.join(work_dir, newfile))
        print("重命名完成!")
        print(os.listdir(work_dir))
  • 作用: 这个函数接受工作目录、旧的文件扩展名和新的文件扩展名作为输入。它遍历目录中的文件,并将具有匹配的旧扩展名的文件重命名为新的扩展名。

  • os.listdir(work_dir): 列出指定目录中的所有文件和目录。

  • os.path.splitext(filename): 将文件名拆分为基本名称和扩展名。例如,"myfile.txt" 会变成 ("myfile", ".txt")。

  • root_name, file_ext = split_file: 将 splitext 返回的元组解包为单独的变量。

  • if old_ext == file_ext:: 检查文件的扩展名是否与提供的旧扩展名匹配。

  • newfile = root_name + new_ext: 构造新的文件名,将原始的基本名称和新的扩展名组合在一起。

  • os.rename(os.path.join(work_dir, filename), os.path.join(work_dir, newfile)): 将原始文件重命名为新文件。os.path.join 用于构建完整的文件路径,这使代码在不包含完整路径时更健壮。

  • print("重命名完成!") 和 print(os.listdir(work_dir)): 打印完成消息和目录的新文件名。

  • 3.get_parser 函数: 

    def get_parser():
        parser = argparse.ArgumentParser(
            description="更改工作目录中文件的扩展名"
        )
        parser.add_argument(
            "work_dir",
            metavar="WORK_DIR",
            type=str,
            nargs=1,
            help="要更改扩展名的目录",
        )
        parser.add_argument(
            "old_ext", metavar="OLD_EXT", type=str, nargs=1, help="旧的扩展名"
        )
        parser.add_argument(
            "new_ext", metavar="NEW_EXT", type=str, nargs=1, help="新的扩展名"
        )
        return parser
  • 作用: 这个函数使用 argparse 模块设置参数解析器。

  • argparse.ArgumentParser(…): 创建一个参数解析器对象,并带有描述。

  • parser.add_argument(…): 定义脚本将接受的参数。

  • work_dir、old_ext、new_ext: 这些是位置参数。当在命令行中执行脚本时,必须提供这些参数。

  • metavar: 用于在帮助消息中显示。

  • type=str: 指定参数应解释为字符串。

  • nargs=1: 表示每个参数都必须出现且仅出现一次。

  • help: 提供每个参数的描述。

  • 4. main 函数: 

    def main():
        """
        如果直接调用脚本,将调用此函数。
        """
        parser = get_parser()
        args = vars(parser.parse_args())
    
        work_dir = args["work_dir"][0]
        old_ext = args["old_ext"][0]
        if old_ext and old_ext[0] != ".":
            old_ext = "." + old_ext
        new_ext = args["new_ext"][0]
        if new_ext and new_ext[0] != ".":
            new_ext = "." + new_ext
    
        batch_rename(work_dir, old_ext, new_ext)
  • 作用: 如果直接运行脚本,这个函数是脚本的入口点。

  • parser = get_parser(): 获取设置好的参数解析器。

  • args = vars(parser.parse_args()): 解析用户在命令行中提供的参数,并将它们存储在字典中。vars 将参数的命名空间对象转换为字典。

  • work_dir = args["work_dir"][0]: 从 args 字典中检索 work_dir 参数。它使用 [0] 是因为 nargs=1 返回一个包含 1 个元素的列表。

  • old_ext = args["old_ext"][0] 和 new_ext = args["new_ext"][0]: 与 work_dir 类似,但分别用于旧扩展名和新扩展名。

  • if old_ext and old_ext[0] != ".": old_ext = "." + old_ext 和 if new_ext and new_ext[0] != ".": new_ext = "." + new_ext: 这确保扩展名带有“.”。它通过检查扩展名是否以“.”开头来实现,如果没有,则添加“.”。

  • batch_rename(work_dir, old_ext, new_ext): 调用 batch_rename 函数,使用提供的参数重命名文件。

  • 5.如何从终端运行脚本

    1. 保存脚本: 将其保存为 .py 文件,例如 rename_files.py。

    2. 使其可执行 (仅限 Linux/macOS): chmod +x rename_files.py

    3. 从终端运行:

      python rename_files.py /path/to/your/directory txt pdf
      # 或者,如果完成了 chmod +x:
      ./rename_files.py /path/to/your/directory txt pdf
  • 将 /path/to/your/directory 替换为包含要重命名文件的目录的实际路径。

  • 将 txt 替换为旧扩展名(不带点)。

  • 将 pdf 替换为新扩展名(不带点)。

  • 6.示例

    假设你有一个文件夹 /home/user/my_docs 包含:

  • report.txt

  • notes.txt

  • image.jpg

  • 如果你像这样运行脚本:

    python rename_files.py /home/user/my_docs txt pdf

    脚本运行完毕后,你的 /home/user/my_docs 将包含以下内容:

  • report.pdf

  • notes.pdf

  • image.jpg

  • 作者:赔罪

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 脚本-批量重命名指定目录中的一组文件,并更改其扩展名

    发表回复