背景

可能某些人面临着这样的需求:文件目录层级很多,希望对某一指定目录或者某一指定目录包括其子目录的所有同类型文件(后缀相同)进行操作

假设有以下文件结构

D:/root/
         d1/
             d2/
                 c.mp4
             b.mp4

         a.mp4
D:/video

如果想操作:/root包括其下的所有mp4文件(a.mp4,b.mp4,c.mp4),或者某一目录的mp4文件(b.mp4),本文将对你有所帮助

本文涉及:

文件剪切

同类型文件移动

同类型文件删除

一、原理及所用函数

移动同类型文件必然需要两个要素:源文件路径目的文件路径后缀名

如何获得所有源文件路径必然是第一个需要解决的问题

1.1、获得所有源文件路径

glob包的glob()函数和iglob()函数可以通过正则表达式来返回所有源文件的路径

简单介绍下用法

glob(正则, recursive=True)

下面介绍下获取该目录包括所有子目录文件的正则如何写

例如:获取root目录及其子目录所有mp4类型文件,注意root后的一级目录一定写两个**

o_path = 'D:/root/**/*.mp4' 
paths = glob(o_path,recursive=True)

上述代码执行结束后会将a b c这三个视频的路径以列表的形式保存到paths中

如果仅写一个*那就仅仅是代表着一级目录,可用于获取指定目录的所有文件

例如:只想获得b.mp4

#D:/root/
#         d1/
#             d2/
#                 c.mp4
#             b.mp4
#
#         a.mp4
#D:/video
o_path = 'D:/root/*/*.mp4' 
paths = glob(o_path)

1.2、获得目的文件路径和后缀

自己输入

1.3、其他需要用到的函数

拷贝文件

shutil.copyfile(源路径,目的路径)

删除文件

os.remove(源路径)

 获得时间戳

time.time()

返回结果是有七位小数的时间戳

建议左移七位,以免小数点被当作后缀的开头

int(time.time()*1e7)

 一看就懂,不赘述

二、代码+注释

import os
import shutil
import glob
import time

#剪切文件
#o_path:源路径
#d_path:目的路径
def shear(o_path,d_path):
        #拷贝
        shutil.copyfile(o_path,d_path)
        #删除
        os.remove(o_path)

#移动文件
#o_path:源路径
#d_path:目的路径
#suffix:文件后缀
def move_file(o_path,d_path,suffix):
    #文件量多时 使用iglob的效率比glob函数要高
    #获取文件全路径的列表
    paths = glob.iglob(o_path + suffix , recursive=True)
    #拿到每个文件的全路径
    for path in paths:
        #拼接需要移动的全路径,用时间戳代替原文件名,避免出现文件名重复的情况
        dp = d_path + str(int(time.time()*1e7)) + suffix
        #不想改变文件名就这样写
        #dp = d_path + path.split('\\')[-1] + suffix
        #剪切
        shear(path,dp)

#删除文件
#o_path:源路径
#suffix:文件后缀
def del_file(o_path,suffix):
    paths = glob.iglob(o_path + suffix , recursive=True)
    for path in paths:
        os.remove(path)

#批量移动文件
#o_path:源路径
#d_path:目的路径
#suffix_type:装有多个后缀的列表
def move(o_path,d_path,suffix_type):
    for suffix in suffix_type:
        move_file(o_path,d_path,suffix)

d_path = 'D:/某雷下载/Download/**/*'
v = 'D:/某雷下载/v/'
p = 'D:/某雷下载/p/'
jpg = '.jpg'
mp4 = '.mp4'
avi = '.avi'
mov = '.mov'
png = '.png'
xltd = '.xltd'

video = [mp4,avi,mov]
picture = [png,jpg]

#移动所有视频
move(d_path,v,video)
#移动所有图片
move(d_path,p,picture)
#移动指定类型文件
move_file(d_path,v,mov)
#删除指定类型文件
del_file(d_path,xltd)

三、结语

博主暂时没有其他需求,便没有实现其他功能,可依据个人需求对上述代码进行修改,如果需要对文件名进行筛选,使用相关正则表达式即可,例如选取ikun开头的视频

d_path = 'D:/root/**/ikun*.mp4'

别的可以自行摸索