Python3-批量重命名指定目录中的一组文件,更改其扩展名
- 1.argparse模块
- 2.vars内置函数
- 3.os.listdir(path)
- 4.os.path.splitext(filepath)
- 5.os.path.join
- 6.os.rename
- 7.os.path.isfile
- 8.批量重命名指定目录中的一组文件,更改其扩展名
1.argparse模块
argparse
是 Python 中用于解析命令行参数的标准库模块。
1. 导入 argparse
模块
要使用 argparse
模块,首先需要导入它:
import argparse
2. 创建 ArgumentParser 对象
在使用 argparse
解析命令行参数之前,需要创建一个 ArgumentParser
对象。这个对象将包含所有的命令行参数定义。
parser = argparse.ArgumentParser(description='Description of your program')
在创建 ArgumentParser
对象时,可以指定一个可选的参数 description
,用于描述你的程序。
3. 添加命令行参数
使用 add_argument()
方法向 ArgumentParser
对象添加命令行参数。该方法接受一些参数,用于指定命令行参数的名称、类型、帮助信息等。
parser.add_argument('arg_name', type=str, help='Help message for the argument')
上述代码示例中,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')
在上述示例中,我们定义了两个可选参数,分别是 --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')
在上述示例中,--count
参数被指定为整数类型,并设置了默认值为 1。--color
参数只能接受在给定的选项列表 ['red', 'green', 'blue']
中的值。--required-arg
参数被设置为必需的,不提供该参数将触发错误。
4. 解析命令行参数
一旦所有的命令行参数都被添加到 ArgumentParser
对象中,可以使用 parse_args()
方法解析命令行参数。该方法将返回一个包含解析结果的命名空间对象。
args = parser.parse_args()
完整示例
下面是一个完整的示例,演示如何使用 argparse
解析命令行参数:
import argparseparser = 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)
假设上述代码保存为 example.py
文件,可以在命令行中运行以下命令进行测试:
python example.py John --age 25
输出结果将会是:
Name: John
Age: 25
2.vars内置函数
在 Python 中,vars()
是一个内置函数,用于返回对象的属性和属性值的字典。它可以应用于模块、类、实例或其他拥有__dict__
属性的对象。__dict__
是一个字典,包含了对象的属性和对应的值。
以下是 vars()
函数的使用示例:
1.对于模块
import math
print(vars(math)) # 返回 math 模块的属性和属性值的字典
2. 对于类
class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 25)# 获取对象的属性和属性值的字典
person_dict = vars(person)
print(person_dict)
输出:
{'name': 'Alice', 'age': 25}
使用 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)
4.os.path.splitext(filepath)
os.path.splitext()
是 Python 的 os.path
模块中的函数,用于将文件路径分割为文件名和文件扩展名。它返回一个包含文件名和扩展名的元组。
以下是 os.path.splitext()
的用法示例:如果文件路径不包含扩展名,extension
变量将是一个空字符串。
import osfile_path = "/path/to/file.txt"
filename, extension = os.path.splitext(file_path)print("Filename:", filename) # 输出文件名部分
print("Extension:", extension) # 输出扩展名部分
'''
Filename: /path/to/file
Extension: .txt
'''
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)
在这个例子中,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)
需要注意的是,os.rename()
函数只能对存在的文件或目录进行重命名操作,而且它不会递归地重命名目录下的所有子目录和文件。
如果要对目录进行重命名操作,目录必须为空,否则会引发 OSError
异常。如果要对非空目录进行重命名,可以使用 shutil
模块中的 shutil.move()
函数。
os.rename
函数可以用于重命名文件和目录。如果当前文件或目录不存在,或者新名称已经存在,将会引发相应的异常。确保在使用os.rename
函数之前,您已经检查了相关的条件,以避免出现错误。
7.os.path.isfile
os.path.isfile()
是 Python 的 os.path
模块中的函数,用于检查给定路径是否为文件。
以下是 os.path.isfile()
的用法示例:
import osfile_path = "/path/to/file.txt"
if os.path.isfile(file_path):print("路径是一个文件")
else:print("路径不是一个文件")
在这个例子中,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 osdef 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 extensionsplit_file = os.path.splitext(filename)# Unpack tuple elementroot_name, file_ext = split_file# Start of the logic to check the file extensions, if old_ext = file_extif old_ext == file_ext:# Returns changed name of the file with new extentionnewfile = root_name + new_ext# Write the filesos.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 parserdef main():"""This will be called if the script is directly invoked."""# adding command line argumentparser = 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 passedwork_dir = args["work_dir"][0]# Set the variable old_ext with the second argument passedold_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 passednew_ext = args["new_ext"][0]if new_ext and new_ext[0] != ".":new_ext = "." + new_extprint(work_dir) # .print(old_ext) # .txtprint(new_ext) # .tmdbatch_rename(work_dir, old_ext, new_ext)# python main.py . txt tmd
if __name__ == "__main__":main()