奇淫巧技:用Python按时间归类文档照片等数据

前言

前几天需要做一个视频,是一个活动的全程录像,大量的mpg格式的视频,需要从中挑选精品视频按活动流程,用pr做成一个片头,需要有整个活动大体流程,不超过5分钟。面对大量视频,能不能用python让视频按时间归类,然后我每个时间段都可以选出一些视频,保证时间顺序。

思路

对于当下热门语言Python,自然不缺少IO操作库,通过一阵检索,找到shutil库

shuil模块提供了许多对文件和文件集合的高级操作。特别是,提供了支持文件复制和删除的函数。

经过简单学习,已有初步了解。
大体流程;

  1. 遍历目标文件夹
  2. 获取当前文件的创建时间
  3. 判断当前文件夹 是否含有 以 当前文件的创建时间 为名的 文件夹
  4. 如果有,移动该文件到目标时间文件夹;否则,创建目标时间文件夹,移动。

动手

对于文件整理小工具,想必以后也可以用到,遂用tk库来将此做成桌面应用,程序忽略文件夹,仅对文件进行处理,不判断文件什么格式。
文件分创建时间,修改时间可以通过文件属性查看,当然,os库提供了查看文件创建时间的功能。

用到的库:
  1. os
  2. time
  3. shutil
  4. tkinter
  5. 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进万家………………

发布了73 篇原创文章 · 获赞 207 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_44198436/article/details/105319911
今日推荐