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.如何从终端运行脚本
-
保存脚本: 将其保存为 .py 文件,例如 rename_files.py。
-
使其可执行 (仅限 Linux/macOS): chmod +x rename_files.py
-
从终端运行:
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
作者:赔罪