Python实现按分钟阈值依修改时间删重复视频 保留最早文件
AVI录像重复文件清理脚本实现
核心逻辑
针对网络摄像头生成的AVI格式录像,按自定义分钟间隔阈值清理重复片段,仅保留相邻阈值间隔内最早生成的文件,执行流程如下:
- 扫描指定目录下所有.AVI后缀文件,读取每个文件的修改时间戳
- 将所有文件按修改时间从早到晚升序排序
- 从最早的文件开始遍历,记录上一个已保留文件的时间:若当前文件与上一个保留文件的时间差小于设定阈值,标记为待删除;若时间差大于等于阈值,则保留当前文件,更新时间标记
- 默认开启试运行模式,先打印待保留/待删除列表供核对,确认无误后再执行真实删除,避免误删
对应给出的测试场景:当阈值设置为2分钟时,08:30:15的Ek001.AVI为最早文件直接保留,08:30:40的Ek002.AVI与Ek001间隔25秒小于阈值标记删除,08:32:55的Ek003.AVI与Ek001间隔2分40秒大于阈值保留,完全匹配预期结果。
完整代码
import os import glob from datetime import datetime # -------------------------- 可配置参数 -------------------------- TARGET_PATH = 'C:\\Users\\xxx\\*.AVI' # 待扫描的AVI文件匹配路径 THRESHOLD_MINUTES = 2 # 分钟间隔阈值,相邻保留文件的时间差不小于该值 DRY_RUN = True # 试运行开关:True时仅打印结果不删除文件,确认无误后改为False再执行真实清理 # ---------------------------------------------------------------- # 读取所有AVI文件的修改时间和路径 file_list = [] for file in glob.glob(TARGET_PATH): mtime = os.path.getmtime(file) file_list.append((mtime, file)) # 按修改时间从早到晚排序 file_list.sort(key=lambda x: x[0]) if not file_list: print("未找到匹配的AVI文件") exit() # 遍历判定待保留/待删除文件 keep_files = [] delete_files = [] # 排序后的第一个文件默认保留 last_keep_mtime, last_keep_path = file_list[0] keep_files.append((last_keep_mtime, last_keep_path)) for mtime, file_path in file_list[1:]: time_diff_min = (mtime - last_keep_mtime) / 60 if time_diff_min < THRESHOLD_MINUTES: delete_files.append((mtime, file_path)) else: keep_files.append((mtime, file_path)) last_keep_mtime = mtime # 打印统计结果 print("=" * 60) print(f"当前间隔阈值:{THRESHOLD_MINUTES}分钟") print(f"扫描到文件总数:{len(file_list)} | 待保留:{len(keep_files)} | 待删除:{len(delete_files)}") print("=" * 60) print("\n【待保留文件】") for mtime, f in keep_files: print(f"{datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S')} --> {os.path.basename(f)}") print("\n【待删除文件】") for mtime, f in delete_files: print(f"{datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S')} --> {os.path.basename(f)}") # 执行删除操作 if not DRY_RUN: print("\n开始执行删除...") for mtime, f in delete_files: try: os.remove(f) print(f"已删除:{os.path.basename(f)}") except Exception as e: print(f"删除{os.path.basename(f)}失败:{str(e)}") else: print("\n当前为试运行模式,未执行任何删除操作。核对列表无误后,将代码中DRY_RUN参数改为False即可执行真实清理。")
使用注意事项
- 首次运行务必保持
DRY_RUN = True,仔细核对输出的待保留、待删除列表,确认符合预期后再关闭试运行模式 - 可根据实际录像重叠情况调整
THRESHOLD_MINUTES参数,例如设置为1代表间隔小于1分钟的重复片段仅保留最早的1个 TARGET_PATH请替换为实际的录像存储路径,Windows环境下推荐使用原始字符串写法避免转义问题,例如r'C:\Users\你的用户名\摄像头录像\*.AVI'
内容的提问来源于stack exchange,提问作者Kukkik
相关产品推荐
相关产品推荐

