• Python3-批量重命名指定目录中的一组文件,更改其扩展名



    1.argparse模块

    argparse 是 Python 中用于解析命令行参数的标准库模块。

    1. 导入 argparse 模块

    要使用 argparse 模块,首先需要导入它:

    import argparse
    
    • 1

    2. 创建 ArgumentParser 对象

    在使用 argparse 解析命令行参数之前,需要创建一个 ArgumentParser 对象。这个对象将包含所有的命令行参数定义。

    parser = argparse.ArgumentParser(description='Description of your program')
    
    • 1

    在创建 ArgumentParser 对象时,可以指定一个可选的参数 description,用于描述你的程序。

    3. 添加命令行参数

    使用 add_argument() 方法向 ArgumentParser 对象添加命令行参数。该方法接受一些参数,用于指定命令行参数的名称、类型、帮助信息等。

    parser.add_argument('arg_name', type=str, help='Help message for the argument')
    
    • 1

    上述代码示例中,arg_name 是命令行参数的名称,type 参数指定了参数的类型(这里是字符串类型),help 参数用于提供命令行帮助信息。


    上面添加的是位置参数,载明行中按照顺序传递的参数。可选参数是在命令行中使用选项标志(例如 -h--help)传递的参数,可以根据需要选择是否提供。可以使用 add_argument 方法来定义可选参数。

    parser.add_argument('--verbose', action='store_true', help='Enable verbose mode')
    parser.add_argument('--output', type=str, help='Specify the output file')
    
    • 1
    • 2

    在上述示例中,我们定义了两个可选参数,分别是 --verbose--output--verbose 参数使用 store_true 动作,表示如果存在该选项,则将参数的值设为 True--output 参数接受一个字符串作为值。

    add_argument() 方法还接受其他一些可选参数,例如:

    • action:指定参数的行为,如存储值、统计参数出现次数等。
    • default:指定参数的默认值。
    • choices:限制参数的取值范围。
    • required:指定是否参数是必需的。
    parser.add_argument('--count', type=int, default=1, help='Specify the count')
    parser.add_argument('--color', choices=['red', 'green', 'blue'], help='Specify the color')
    parser.add_argument('--required-arg', required=True, help='This argument is required')
    
    • 1
    • 2
    • 3

    在上述示例中,--count 参数被指定为整数类型,并设置了默认值为 1。--color 参数只能接受在给定的选项列表 ['red', 'green', 'blue'] 中的值。--required-arg 参数被设置为必需的,不提供该参数将触发错误。

    4. 解析命令行参数

    一旦所有的命令行参数都被添加到 ArgumentParser 对象中,可以使用 parse_args() 方法解析命令行参数。该方法将返回一个包含解析结果的命名空间对象。

    args = parser.parse_args()
    
    • 1

    完整示例

    下面是一个完整的示例,演示如何使用 argparse 解析命令行参数:

    import argparse
    
    parser = argparse.ArgumentParser(description='Example program for argparse')
    
    parser.add_argument('name', type=str, help='Name of the user')
    parser.add_argument('--age', type=int, help='Age of the user')
    
    args = parser.parse_args()
    
    print('Name:', args.name)
    print('Age:', args.age)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    假设上述代码保存为 example.py 文件,可以在命令行中运行以下命令进行测试:

    python example.py John --age 25
    
    • 1

    输出结果将会是:

    Name: John
    Age: 25
    
    • 1
    • 2

    2.vars内置函数

    在 Python 中,vars() 是一个内置函数,用于返回对象的属性和属性值的字典。它可以应用于模块、类、实例或其他拥有__dict__属性的对象。__dict__是一个字典,包含了对象的属性和对应的值。

    以下是 vars() 函数的使用示例:

    1.对于模块

    import math
    print(vars(math))  # 返回 math 模块的属性和属性值的字典
    
    • 1
    • 2

    2. 对于类

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    person = Person("Alice", 25)
    
    # 获取对象的属性和属性值的字典
    person_dict = vars(person)
    print(person_dict)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出:

    {'name': 'Alice', 'age': 25}
    
    • 1

    使用 vars() 函数,我们可以获取 person 对象的属性和属性值的字典,并将其存储在 person_dict 变量中。输出结果显示了 person_dict 字典,其中包含了对象的属性名和对应的属性值。

    需要注意的是,vars() 函数只能用于获取普通对象(具有实例变量)的属性和属性值,而不能用于获取内置对象(如列表、字典)的属性和属性值。对于内置对象,可以使用相应的方法(如 dir())来获取属性和方法列表。

    3.os.listdir(path)

    os.listdir() 函数接受一个路径作为参数,并返回该路径下的所有文件和文件夹的列表。在这个例子中,路径参数 . 表示当前目录。

    以下是示例代码:

    import os
    
    # 列出当前目录下的文件和文件夹
    files = os.listdir(".")
    for file in files:
        print(file)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.os.path.splitext(filepath)

    os.path.splitext() 是 Python 的 os.path 模块中的函数,用于将文件路径分割为文件名和文件扩展名。它返回一个包含文件名和扩展名的元组。

    以下是 os.path.splitext() 的用法示例:如果文件路径不包含扩展名,extension 变量将是一个空字符串。

    import os
    
    file_path = "/path/to/file.txt"
    filename, extension = os.path.splitext(file_path)
    
    print("Filename:", filename)  # 输出文件名部分
    print("Extension:", extension)  # 输出扩展名部分
    '''
    Filename: /path/to/file
    Extension: .txt
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.os.path.join

    os.path.join() 是 Python 的 os.path 模块中的函数,用于将多个路径组合成一个完整的路径。

    以下是 os.path.join() 的用法示例:

    import os
    
    # 组合路径
    path = os.path.join("dir1", "dir2", "file.txt")
    print(path)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这个例子中,os.path.join() 接受多个路径参数,并将它们组合成一个完整的路径。每个参数可以是字符串,表示路径的各个部分。

    输出将显示组合后的完整路径:dir1/dir2/file.txt

    os.path.join() 函数的特点是它会根据操作系统的规则自动处理路径分隔符。它会根据当前操作系统的约定,使用适当的路径分隔符(例如 /\)来组合路径。

    这使得代码在不同操作系统上具有可移植性,而无需显式指定路径分隔符。

    os.path.join() 只是将路径组合成一个字符串,它不会检查路径是否存在或验证路径的有效性。它只是简单地将给定的路径部分连接在一起,形成一个完整的路径字符串。

    6.os.rename

    os.rename() 是 Python 的 os 模块中的函数,用于对文件或目录进行重命名操作。

    以下是 os.rename() 的用法示例:

    import os
    
    # 重命名文件或目录
    old_name = "old_name.txt"
    new_name = "new_name.txt"
    os.rename(old_name, new_name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要注意的是,os.rename() 函数只能对存在的文件或目录进行重命名操作,而且它不会递归地重命名目录下的所有子目录和文件。

    如果要对目录进行重命名操作,目录必须为空,否则会引发 OSError 异常。如果要对非空目录进行重命名,可以使用 shutil 模块中的 shutil.move() 函数。

    os.rename函数可以用于重命名文件和目录。如果当前文件或目录不存在,或者新名称已经存在,将会引发相应的异常。确保在使用os.rename函数之前,您已经检查了相关的条件,以避免出现错误。

    7.os.path.isfile

    os.path.isfile() 是 Python 的 os.path 模块中的函数,用于检查给定路径是否为文件。

    以下是 os.path.isfile() 的用法示例:

    import os
    
    file_path = "/path/to/file.txt"
    if os.path.isfile(file_path):
        print("路径是一个文件")
    else:
        print("路径不是一个文件")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这个例子中,os.path.isfile() 函数接受一个路径作为参数,并返回一个布尔值。如果给定路径指向一个文件,则返回 True;否则,返回 False

    通过使用 if 语句,可以根据 os.path.isfile() 的返回值来执行相应的操作。在这个例子中,如果路径 file_path 是一个文件,就会打印 “路径是一个文件”;否则,会打印 “路径不是一个文件”。

    请注意,os.path.isfile() 只检查给定路径是否为文件,而不会检查文件是否存在。如果路径不存在或指向一个目录,os.path.isfile() 仍然会返回 False

    因此,在使用 os.path.isfile() 函数之前,最好先确保路径存在,或者结合其他函数(如 os.path.exists())一起使用,来进行路径的有效性检查。

    8.批量重命名指定目录中的一组文件,更改其扩展名

    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())
    
        # {'work_dir': ['.'], 'old_ext': ['txt'], 'new_ext': ['tmd']}
        print(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
    
    
        print(work_dir) # .
        print(old_ext)  # .txt
        print(new_ext)  # .tmd
        batch_rename(work_dir, old_ext, new_ext)
    
    # python main.py . txt tmd
    if __name__ == "__main__":
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
  • 相关阅读:
    【LeetCode】Day108-和为 K 的子数组
    JAVA幼儿园管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
    mysql杂记漫谈
    CMake Tutorial 巡礼(8)_为测试白板添加支持
    计算机毕业设计ssm基于SSM框架在线电影评论投票系统3gr0f系统+程序+源码+lw+远程部署
    树的存储结构
    论文复现|Panoptic Deeplab(全景分割PyTorch)
    【Python基础篇020】网络编程初识
    机器学习算法交叉验证最频繁犯的6个错误
    RT Preempt linux学习笔记
  • 原文地址:https://blog.csdn.net/ArthurHai521/article/details/133800568