前言
前几天需要做一个视频,是一个活动的全程录像,大量的mpg格式的视频,需要从中挑选精品视频按活动流程,用pr做成一个片头,需要有整个活动大体流程,不超过5分钟。面对大量视频,能不能用python让视频按时间归类,然后我每个时间段都可以选出一些视频,保证时间顺序。
思路
对于当下热门语言Python,自然不缺少IO操作库,通过一阵检索,找到shutil库:
shuil模块提供了许多对文件和文件集合的高级操作。特别是,提供了支持文件复制和删除的函数。
经过简单学习,已有初步了解。
大体流程;
- 遍历目标文件夹
- 获取当前文件的创建时间
- 判断当前文件夹 是否含有 以 当前文件的创建时间 为名的 文件夹
- 如果有,移动该文件到目标时间文件夹;否则,创建目标时间文件夹,移动。
动手
对于文件整理小工具,想必以后也可以用到,遂用tk库来将此做成桌面应用,程序忽略文件夹,仅对文件进行处理,不判断文件什么格式。
文件分创建时间,修改时间可以通过文件属性查看,当然,os库提供了查看文件创建时间的功能。
用到的库:
- os
- time
- shutil
- tkinter
- threading
简单布局界面:
在制作简单界面时,布局采用gird函数
app=Tk()
app.title('归档工具 author:liubingzhe')
self.path = StringVar()#当前路径显示
self.filename=StringVar()#正在处理的文件名
self.dicpath=''#当前路径
Label(app,text = "选择路径:",width='7').grid(row = 0, column = 0)
Label(app,textvariable =self.filename).grid(row = 1, column = 1)
Label(app,text ='仅根据创建时间|').grid(row = 2, column = 0)
Label(app,text ='选择要处理的文件夹,点击移动或复制文件').grid(row = 2, column = 1)
Entry(app, textvariable = self.path,width='35').grid(row = 0, column = 1)
Button(app, text = "路径选择", command = self.selectPath,width='6',height='1').grid(row = 0, column = 3)
Button(app,text ='复制文件',command =self.thread_run,width='6',height='1').grid(row = 1, column = 3)
Button(app,text ='移动文件',command =self.thread_run_t,width='6',height='1').grid(row = 2, column = 3)
app.mainloop()
主体函数:
def mov_files(self,flag):
start=time.time()
dicPath=self.dicpath
fileList = os.listdir(dicPath)
for x in fileList:
filepath = dicPath + "/" + x
if os.path.isfile(filepath):
dataStr = self.get_format_time(os.path.getmtime(filepath))#获得当前时间
dirname=os.path.join(dicPath,dataStr)
if os.path.exists(dirname):
self.filename.set('正在移动'+x)
shutil.copyfile(filepath,os.path.join(dirname,x)) if flag==1 else shutil.move(filepath,os.path.join(dirname,x))
else:
os.mkdir(dirname)
self.filename.set('正在移动'+x)
shutil.copyfile(filepath,os.path.join(dirname,x)) if flag==1 else shutil.move(filepath,os.path.join(dirname,x))
end=time.time()
self.filename.set('已完成!耗时:%.2f'%(float(end-start)))
加入耗时计算和当前处理文件名
获取文件创建时间函数:
def get_format_time(self,timeStamp):
timeStruct = time.localtime(int(timeStamp))
return time.strftime("%Y{}%m{}", timeStruct).format('年','月')
#return time.strftime("%Y{}%m{}%d{}%H{}", timeStruct).format('年','月','日','时')
实现浏览文件目录from tkinter.filedialog import askdirectory
:
def selectPath(self):
self.dicpath = askdirectory()
self.path.set(self.dicpath)
总代码:
import os,time,shutil
from tkinter import *
from tkinter.filedialog import askdirectory
import threading
class arrangeGui:
def __init__(self):
app=Tk()
app.title('归档工具 author:liubingzhe')
self.path = StringVar()
self.filename=StringVar()
self.dicpath=''
Label(app,text = "选择路径:",width='7').grid(row = 0, column = 0)
Label(app,textvariable =self.filename).grid(row = 1, column = 1)
Label(app,text ='仅根据创建时间|').grid(row = 2, column = 0)
Label(app,text ='选择要处理的文件夹,点击移动或复制文件').grid(row = 2, column = 1)
Entry(app, textvariable = self.path,width='35').grid(row = 0, column = 1)
Button(app, text = "路径选择", command = self.selectPath,width='6',height='1').grid(row = 0, column = 3)
Button(app,text ='复制文件',command =self.thread_run,width='6',height='1').grid(row = 1, column = 3)
Button(app,text ='移动文件',command =self.thread_run_t,width='6',height='1').grid(row = 2, column = 3)
app.mainloop()
def mov_files(self,flag):
start=time.time()
dicPath=self.dicpath
fileList = os.listdir(dicPath)
for x in fileList:
filepath = dicPath + "/" + x
if os.path.isfile(filepath):
dataStr = self.get_format_time(os.path.getmtime(filepath))#获得当前时间
dirname=os.path.join(dicPath,dataStr)
if os.path.exists(dirname):
self.filename.set('正在移动'+x)
shutil.copyfile(filepath,os.path.join(dirname,x)) if flag==1 else shutil.move(filepath,os.path.join(dirname,x))
else:
os.mkdir(dirname)
self.filename.set('正在移动'+x)
shutil.copyfile(filepath,os.path.join(dirname,x)) if flag==1 else shutil.move(filepath,os.path.join(dirname,x))
end=time.time()
self.filename.set('已完成!耗时:%.2f'%(float(end-start)))
def get_format_time(self,timeStamp):
timeStruct = time.localtime(int(timeStamp))
return time.strftime("%Y{}%m{}", timeStruct).format('年','月')
#return time.strftime("%Y{}%m{}%d{}%H{}", timeStruct).format('年','月','日','时')
def selectPath(self):
self.dicpath = askdirectory()
self.path.set(self.dicpath)
def thread_run(self):
t1=threading.Thread(target=self.mov_files,args=(1,))
t1.start()
def thread_run_t(self):
t1=threading.Thread(target=self.mov_files,args=(2,))
t1.start()
当前线程已被tk占用,所以函数必须要另启线程来处理。
至此,完成。
试一试
总计455个视频
精确到小时:
对照片处理:
两千多张照片0.02秒完成,真爽……
最后
可以进一步对文件夹或限制文件类型进行处理,比如同类型归类等,还有许多可以完善扩展的地方。
最最后
感叹!
小学六年级的小朋友写的代码……………………
Python进万家………………