当前位置:首页>python>python实践小工具(批量修改文件名)

python实践小工具(批量修改文件名)

  • 2026-10-21 13:27:52
python实践小工具(批量修改文件名)

Python 基础知识我们已经学完了,开启python动手实践篇,我们上一篇动手实践做了个贪吃蛇小游戏,巩固掌握的 Python 知识,类与对象的设计,还有pygame的基础使用,本篇我们动手实践一些常用小工具,批量修改文件名。

批量修改文件名小工具可以练习的知识

实现功能

给定一个路径,

  1. 1. 统计路径下的文件数量get_files_count_in_path
  2. 2. 返回路径下的所有给定扩展名类型的文件列表get_files_in_path
  3. 3. 根据批量修改文件名的预设要求,修改文件名
  4. 4. 预设参数如何传递给py文件

知识点

核心函数:

  1. 1. os.path.exists 判断路径是否存在
  2. 2. os.path.isfile 给定的路径是不是一个文件
  3. 3. os.path.join 把给定的路径合在一起
  4. 4. os.path.splitext
  5. 5. os.listdir 把路径下的文件和文件夹生成一个列表
  6. 6. os.rename
  7. 7. argparse.ArgumentParser

list: 生成式语法

string:strip移除字符串开头和结尾的指定字符,默认情况下会移除两端的空白字符(空格、换行符 \n、制表符 \t 等)strip() 只处理开头和结尾的字符,不影响字符串中间的内容

批量修改文件名具体实现

import osimport argparsefrom pathlib import Pathdef get_files_in_path(folder_path: str, extension: list | str) -> int | None:"""    验证路径有效性,返回路径下的文件数量    """# 验证路径有效性ifnot os.path.exists(folder_path):print("无效的文件夹路径")return Noneifnot os.path.isdir(folder_path):print("路径不是文件夹")return None# 使用 os.listdir返回路径下的文件数量    files = os.listdir(folder_path)ifnot files:print("路径下没有文件")return None    files = [file for file in files if os.path.isfile(        os.path.join(folder_path, file))]if extension is None:return filesif isinstance(extension, str):# 字符串按照.分割,然后转换成扩展名列表        extension = [ext.strip().lower() for ext in extension.split(",")]# 统一处理成带点的文件扩展名    extension = [ext if ext.startswith(".") elsef".{ext}"for ext in extension]    files = [file for file in filesif any(file.lower().endswith(ext.lower()) for ext in extension)]return filesdef get_files_count_in_path(folder_path: str, extension: list | str) -> int | None:    files = get_files_in_path(folder_path, extension)if files is None:return 0else:return len(files)def batch_rename_files(        folder_path: str,        prefix: str = "",        suffix: str = "",        replace_old: str = "",        replace_new: str = "",        start_index: int = 1,        only_index_rename: bool = False,        extension_filter: list | str = None,        dry_run: bool = True) -> int:"""    批量重命名指定文件夹下的文件。    Args:        folder_path: 目标文件夹路径(必填)。        prefix: 文件名前缀(默认空,不添加前缀)。        suffix: 文件名后缀(添加在原文件名和扩展名之间,默认空)。        replace_old: 需要替换的旧字符串(默认空,不执行替换)。        replace_new: 替换后的新字符串(与replace_old配合使用)。        start_index: 序号命名的起始数字(默认1)。        only_index_rename: 是否仅用序号命名        (忽略prefix/suffix/replace,默认False)。        extension_filter: 筛选特定扩展名的文件        (如".txt"或[".jpg", ".png"],默认None表示所有文件)。        dry_run: 是否模拟运行(True:仅打印结果不实际重命名;        False:执行实际重命名,默认True)。    Returns:        重命名成功的文件数量(或模拟运行时的预计数量)。    """    files = get_files_in_path(folder_path, extension_filter)if files is None:return 0if dry_run:print("\n预览改变(不会实际重命名文件):")    renamed_count = 0# 遍历文件列表,处理名字替换逻辑for i, file_name in enumerate(files, start=start_index):        old_name, extension = os.path.splitext(file_name)        new_name = old_nameif prefix:            new_name = prefix + new_nameif suffix:            new_name = new_name + suffixif replace_old:            new_name = new_name.replace(replace_old, replace_new)if start_index > 0:            new_name += f"_{i:04d}"if only_index_rename:            new_name = f"{i:04d}"        new_name += extensionif dry_run:print(f"{file_name} ----> {new_name}")else:try:                old_path = os.path.join(folder_path, file_name)                new_path = os.path.join(folder_path, new_name)                os.rename(old_path, new_path)print(f"已重命名{file_name} ----> {new_name}")                renamed_count += 1except Exception as e:print(f"重命名{file_name}出错,{str(e)}")if renamed_count > 0:print(f"已重命名 {renamed_count} 个文件")def main():    parser = argparse.ArgumentParser(description="批量重命名文件")    parser.add_argument("--folder", "-f", default=".\\", help="要处理的文件夹路径")    parser.add_argument("--prefix", "-p", default="", help="添加前缀")    parser.add_argument("--suffix", "-s", default="", help="添加后缀")    parser.add_argument("--replace", "-r", nargs=2, metavar=("OLD", "NEW"),help="替换文件名中的文本 OLD 为 NEW")    parser.add_argument("--start_index", "-n", type=int, default=1,help="起始编号(默认为1)")    parser.add_argument("--only_index_rename", action="store_true",help="完全根据起始编号去序列号文件名")    parser.add_argument("--extension", "-e",help="文件扩展名过滤器(例如:.jpg 或 .txt,.pdf)")    parser.add_argument("--dry-run", action="store_true",help="预览模式,不实际执行重命名")    args = parser.parse_args()# 处理扩展名过滤器    extension_filter = Noneif args.extension:        extension_filter = [ext.strip() for ext in args.extension.split(",")]# 处理替换参数    replace_old, replace_new = "", ""if args.replace:        replace_old, replace_new = args.replace# 调用批量重命名函数    batch_rename_files(        folder_path=args.folder,        prefix=args.prefix,        suffix=args.suffix,        replace_old=replace_old,        replace_new=replace_new,        start_index=args.start_index,        only_index_rename=args.only_index_rename,        extension_filter=extension_filter,        dry_run=args.dry_run    )if __name__ == "__main__":    main()

写一个cmd批处理程序调用小工具

@echo offpython code_10_1_modify_file_name.py -f=..\\test_res\\jpg-modify --only_index_rename --prefix=aspause

参数需要改为自己具体的目录和参数,可以练习通过命令行给py文件传递入口参数

如果觉着本篇对您有点帮助,可以点一个在看和红心,是对我最大的鼓舞,如果对您有帮助或者篇中内容有纰漏,也请您留言告知。感谢!

往期经典

<Python起源><Python之禅><Python中的变量并不是我们通常理解的变量><Python的基本数据类型><Python的循环结构><Python字符串的前生今世><Python复合数据类型之列表><Python字典从入门到精通>

感谢您的订阅,关注和阅读!为您提供Python的入门和进阶笔记,对Python深入思考剖析,并一步步实践,一起学习进步。

最新文章

随机文章