Python 基础知识我们已经学完了,开启python动手实践篇,我们上一篇动手实践做了个贪吃蛇小游戏,巩固掌握的 Python 知识,类与对象的设计,还有pygame的基础使用,本篇我们动手实践一些常用小工具,批量修改文件名。
给定一个路径,
核心函数:
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()@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深入思考剖析,并一步步实践,一起学习进步。