常用脚本-持续更新(文件重命名、视频抽帧、拆帧)

2023-11-23 19:12

本文主要是介绍常用脚本-持续更新(文件重命名、视频抽帧、拆帧),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所有代码位置:Learning-Notebook-Codes/Python/常用脚本

1. 文件重命名

1.1 说明

  • 脚本路径:codes/files_rename.py
  • 脚本说明:可以自动重命名某个文件夹下指定类型的文件。
    • 修改前文件名称: img1.jpg
    • 修改后文件名称: Le0v1n-20231123-X-0001.jpg

1.2 代码

import os
import tqdm
import datetime"""============================ 需要修改的地方 ==================================="""
SRC_PATH = 'Python/常用脚本/EXAMPLE_FOLDER'  # 文件夹路径
file_type = ('.png', '.jpg', '.jpeg', '.gif')  # 想要重命名的文件类型# -------------------重命名相关------------------
retain_previous_name = False  # 是否保留之前的名称
new_name = "Le0v1n"  # retain_previous_name为False时生效
use_date_stamp = True  # 是否使用时间戳 -> e.g. 20231123
comment = "X"  # 备注
use_serial_numbering = True  # 是否使用顺序的编号 -> 1, 2, 3, 4, 5, 6, ...
start_number = 1  # 从编号几开始 -> e.g. 1: 从 0001 开始编号
numbering_placeholder = 4  # 编号保留的占位 -> e.g. 0001, 0002, 0003, ...
hyphen = '-'  # 连字符 -> e.g. filename-0001.jpg
"""==============================================================================="""# 获取目录中的所有图片文件
files_list = [file for file in os.listdir(SRC_PATH) if file.lower().endswith(file_type)]"------------计数------------"
TOTAL_FILES_NUM = len(files_list)  # 需要重命名的文件数量
RENAME_NUM = 0  # 重命名成功数量
"---------------------------"# 获取当前时间并格式化时间戳
timestamp = datetime.datetime.now().strftime("%Y%m%d")# 遍历文件
process_bar = tqdm.tqdm(total=TOTAL_FILES_NUM, desc="为指定格式的文件重命名", unit='file')  # 创建进度条
for idx, file_name in enumerate(files_list):file_pre, file_ext = os.path.splitext(file_name)  # 获得文件名和后缀process_bar.set_description(f"rename for \033[1;31m{file_name}\033[0m")# 构建新的文件名if retain_previous_name:  # 保留原有的名称NEW_FILE_NAME = f"{file_pre}"elif new_name:  # 不保留原有的名称且新名称存在NEW_FILE_NAME = new_nameelse:  # 不保留原有的名称也没有新名称 -> 报错raise KeyError(f"不保留原有的名称也没有新名称!")if use_date_stamp:  # 使用时间戳NEW_FILE_NAME += f"{hyphen}{timestamp}"if comment:  # 添加备注NEW_FILE_NAME += f"{hyphen}{comment}" if use_serial_numbering:  # 使用编号NEW_FILE_NAME += f"{hyphen}{idx + start_number:0{numbering_placeholder}d}"# 加上扩展名NEW_FILE_NAME += file_ext# 开始重命名文件         _src = os.path.join(SRC_PATH, file_name)  # 旧文件路径_dst = os.path.join(SRC_PATH, NEW_FILE_NAME)  # 新文件路径os.rename(_src, _dst)  # 重命名文件RENAME_NUM += 1process_bar.update(1)
process_bar.close()print(f"👌 文件重命名完成: {RENAME_NUM}/{TOTAL_FILES_NUM}")

2. 视频抽帧

1.1 说明

  • 脚本路径:codes/extract_frames.py
  • 脚本说明:根据帧间隔对某个文件夹下指定类型的视频文件进行抽帧,得到系列图片。
    • 视频文件所在文件夹名称: EXAMPLE_FOLDER
    • 抽帧得到的文件夹名称: EXAMPLE_FOLDER/extract_frames_results/test_vid_0001.jpg

1.2 代码

import cv2
import os
import tqdm
from utils import create_folder"""============================ 需要修改的地方 ==================================="""
SRC_PATH = "Python/常用脚本/EXAMPLE_FOLDER"  # 原始视频路径
frame_interval = 10  # 视频采样间隔,越小采样率越高 -> 60 | 30 | 15 | 10
video_type = ['.mp4', '.avi']  # 视频格式(.mp4 | .avi)DST_PATH = "extract_frames_results"  # 保存图片文件夹名称
save_img_format = '.jpg'  # 保存的图片格式(.jpg | .png)
"""==============================================================================="""# 构建路径
results_imgs_path = os.path.join(SRC_PATH, DST_PATH)  # 保存图片路径# 得到存放所有视频的list
video_list = [x for x in os.listdir(SRC_PATH) if os.path.splitext(x)[-1] in video_type]"------------计数------------"
TOTAL_VID_NUM = len(video_list)
SUCCEED_NUM = 0  # 完成视频的个数
TOTAL_IMG_NUM = 0  # 统计得到的所有图片数量
"---------------------------"print(f"\033[1;31m[SRC]视频路径为: {SRC_PATH}\033[0m"f"\n\t\033[1;32m视频个数: {TOTAL_VID_NUM}\033[0m"f"\n\033[1;31m[DST]图片保存路径为: {DST_PATH}\033[0m"f"\n\t\033[1;32m保存的图片格式为: {save_img_format}\033[0m"f"\n\n请输入 \033[1;31m'yes'\033[0m 继续,输入其他停止")
_INPUT = input()
if _INPUT != "yes":exit()create_folder(results_imgs_path, verbose=True)  # 创建文件夹# 创建一个tqdm进度条对象
progress_bar = tqdm.tqdm(total=len(video_list), desc="视频拆帧...", unit="vid")
statistics_dict = dict()  # 创建一个字典,用于统计
for vid_name in video_list:  # 遍历所有的视频save_number = 1  # 记录当前视频保存的frame个数vid_pre, vid_ext = os.path.splitext(vid_name)  # 获取文件名和后缀vid_path = os.path.join(SRC_PATH, vid_name)  # 视频完整路径# 创建VideoCapture对象vc = cv2.VideoCapture(vid_path)# 检查视频是否成功打开if not vc.isOpened():continue# 逐帧读取视频并保存为图片frame_count = 0while True:# 读取一帧rval, frame = vc.read()# 检查是否成功读取帧if not rval:  # 读取帧失败break# 每隔 frame_interval 帧保存一次图片if frame_count % frame_interval == 0:# 生成图片文件名frame_name = f"{vid_pre}_{save_number:04d}{save_img_format}"frame_path = os.path.join(results_imgs_path, frame_name)  # Python\常用脚本\EXAMPLE_FOLDER\extract_frames_results\test_vid_0016.jpgprogress_bar.set_description(f"\033[1;31m{vid_name}\033[0m -> "f"\033[1;36m{save_number * frame_interval:04d}\033[0m"f" ({save_number})")  # 更新tqdm的描述# 保存帧为图片cv2.imwrite(frame_path, frame)save_number += 1# 帧数加1frame_count += 1# 释放VideoCapture对象vc.release()TOTAL_IMG_NUM += save_number  # 更新图片数量SUCCEED_NUM += 1statistics_dict[vid_pre] = save_number  # 更新字典,记录当前视频得到的frame个数progress_bar.update()  
progress_bar.close()print("------------------------------------------------------------------")
_cont = 0
for k, v in statistics_dict.items():print(f"\033[1;34m"f"👌 1. [{k}] 得到 frame 个数 -> {v}"f"\033[0m")_cont += 1
print()
print(f"\033[1;31m"f"👌👌👌 视频拆帧 ({TOTAL_VID_NUM}个)完成,总共得到[{TOTAL_IMG_NUM}]张{save_img_format}图片!"f"\033[0m")
print("------------------------------------------------------------------")

这篇关于常用脚本-持续更新(文件重命名、视频抽帧、拆帧)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420122

相关文章

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll