整理收藏的小视频的时候发现很多视频命名很随意,自己命名又太麻烦,看着乱糟糟的文件又心烦,所有写了这个程序,代码如下:
import os
from filetype import filetype
from pymediainfo import MediaInfo
video_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_path
while os.path.exists(repeat_path):
repeat_count += 1
repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'
os.rename(old_path, repeat_path)
# 重命名后输出路径信息并计数加1
print(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)
# 重命名后输出路径信息并计数加1
print(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):
# 重命名后输出路径信息并计数加1
os.rename(old_path, new_path)
print(f'{old_path} -> {new_path}')
count += 1
# 如果存在加编号”-1“后的文件则证明当前编码时间下存在多个文件
else:
# 循环判断加编号直到不存在文件后重命名
repeat_path = first_path
while os.path.exists(repeat_path):
repeat_count += 1
repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'
os.rename(old_path, repeat_path)
# 重命名后输出路径信息并计数加1
print(f'{old_path} -> {repeat_path}')
count += 1
print(f'\n已处理次数:{count}')
if __name__ == '__main__':
print('根据视频编码时间批量重命名视频文件')
# 视频文件所在目录
path = input("请输入视频文件所在目录的路径:")
while path == '':
path = input('路径不能为空:')
RenameByEncodeTime(path)
input('按任意键继续……')
运行截图:
注意:有些视频被二次编编码后,它的编码时间可能被删除,这些视频不会被重命名;目前只测试了mp4、m4v、mov这三种格式,代码中也限定了只修改这三种格式,需要修改其他格式请自行修改代码