所有代碼位置: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("------------------------------------------------------------------")