整理收藏的小视频的时候发现很多视频命名很随意,自己命名又太麻烦,看着乱糟糟的文件又心烦,所有写了这个程序,代码如下:
import osfrom filetype import filetype
from pymediainfo import MediaInfovideo_extension = ('mp4', 'm4v', 'mov')def RenameByEncodeTime(videos_path: str):"""靠视频文件的编码时间来重命名当前路径下的所有视频文件"""# 统计操作次数个数count = 0# 遍历目录for root, dirs, files in os.walk(videos_path):# 循环目录中的文件for file in files:# 获取当前操作文件路径old_path = os.path.join(root, file)# 获取当前操作文件的拓展名extension = filetype.guess_extension(old_path)# 如果当前操作文件是视频才继续if extension in video_extension:# 解析当前操作文件的媒体信息media_info = MediaInfo.parse(old_path)# 然后遍历 media_info.tracks 中的每个轨道。for track in media_info.tracks:# 如果轨道的类型是”General“if track.track_type == 'General':encode_data = track.encoded_date# 编码时间不为空的情况if encode_data:# 去掉文件名中的“:"和“UTC ”new_name = f'{encode_data.replace(":", "").replace("UTC ", "")}'# 获取当前操作文件所在目录的路径dir_name = os.path.dirname(old_path)# 根据新文件名组合新路径new_path = f'{dir_name}\\{new_name}.{extension}'# 初始编码时间下存在文件if os.path.exists(new_path):# 判断旧文件名和新文件名的绝对路径是否相同,防止对已经完成命名的文件重复命名# 先转换为小写是为了解决后缀名大写导致的判断通过的问题if old_path.lower() != new_path.lower():# 重复计数repeat_count = 1# 循环判断加编号后直到不存在文件后重命名repeat_path = new_pathwhile os.path.exists(repeat_path):repeat_count += 1repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'os.rename(old_path, repeat_path)# 重命名后输出路径信息并计数加1print(f'{old_path} -> {repeat_path}')count += 1# 如果同一个编码时间下已存在两个文件时,给使用这个初始编码时间的文件重命名加编号if repeat_count == 2:# 加编号”-1“后的路径first_path = f'{dir_name}\\{new_name}-1.{extension}'os.rename(new_path, first_path)# 重命名后输出路径信息并计数加1print(f'{new_path} -> {first_path}')count += 1# 初始编码时间下是不存在文件,即为初始编码时间下的重命名else:# 重复计数repeat_count = 2# 加编号”-1“后的路径first_path = f'{dir_name}\\{new_name}-1.{extension}'# 不存在加编号”-1“后的文件则证明当前重命名为初始编码时间重命名if not os.path.exists(first_path):# 重命名后输出路径信息并计数加1os.rename(old_path, new_path)print(f'{old_path} -> {new_path}')count += 1# 如果存在加编号”-1“后的文件则证明当前编码时间下存在多个文件else:# 循环判断加编号直到不存在文件后重命名repeat_path = first_pathwhile os.path.exists(repeat_path):repeat_count += 1repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'os.rename(old_path, repeat_path)# 重命名后输出路径信息并计数加1print(f'{old_path} -> {repeat_path}')count += 1print(f'\n已处理次数:{count}')if __name__ == '__main__':print('根据视频编码时间批量重命名视频文件')# 视频文件所在目录path = input("请输入视频文件所在目录的路径:")while path == '':path = input('路径不能为空:')RenameByEncodeTime(path)input('按任意键继续……')
运行截图:
注意:有些视频被二次编编码后,它的编码时间可能被删除,这些视频不会被重命名;目前只测试了mp4、m4v、mov这三种格式,代码中也限定了只修改这三种格式,需要修改其他格式请自行修改代码