python根据文件名移动文件到相应的路径

python批量移动图片文件


今天在Stack Overflow回答了问题:基于文件名称构建目录,并移动文件。
例如:
自动将’ABC2018081224.jpg’放入目标目录下的2018-08文件夹


问题分析:
第一步:找到给定类型的文件(flag参数控制文件类型):查找给定目录下的所有文件,匹配目标类型。可以只查找本目录下的文件(os.listdir),也可以递归的查找所有的子文件夹(os.walk);
第二步:匹配文件名称:构建合适的正则表达式,找的需要的文件;
第三步:移动文件:确定是否需要建立目录、目标目录中是否已有文件。

程序设计:
构建MoveFile类,其中包括findAllJPG方法、parse方法、move方法和run方法。将源目录、目标目录、recursive参数和flag参数传递给类的构造方法,调用run方法将flag和parse界定的文件从源目录移动到目标目录。


代码


from __future__ import print_function
import os, re, shutil
# 移动文件的MoveFile类
class MoveFile(object):
    def __init__(self, srcDir, dstDir, recursive=False, flag='.JPG'):
        self.srcDir = srcDir # 源目录
        self.dstDir = dstDir # 目标目录
        self.recursive = recursive # 递归查找文件夹,默认为False,只查找源目录下的文件,不会递归查找其子文件夹
        self.flag = flag # 要匹配的文件类型 '.JPG'-jpg文件
        self.duplicateFileName = [] # 捕获重复移动文件,即目标文件中已存在此文件
        self.badFileName = [] # 文件类型符合要求,但命名不符合要求
        self.jpgFile = [] # 捕获的jpg文件
        self.srcDirDict = {} # 当递归查找时,记录文件的root目录,在移动时使用
    # 找到给定类型(flag)的文件
    def findAllJPG(self):
        # recursively find file 
        if self.recursive == False:        
            for item in os.listdir(self.srcDir):
                if os.path.isfile(os.path.join(self.srcDir,item)) and \
                                os.path.splitext(item)[-1] == self.flag.lower():
                    self.jpgFile.append(item)
        else:
            for root, dirs, files in os.walk(self.srcDir):
                for item in files:
                    if os.path.splitext(item)[-1] == self.flag.lower():
                        self.jpgFile.append(item)
                        print(root)
                        self.srcDirDict[item] = root

        if not self.jpgFile: 
            print('NOT FIND ANY JPG FILE!')
        return self.jpgFile
    # 使用正则表达式匹配
    def parse(self, text):
        try:
            pat =re.compile('[a-zA-Z]+([\d]+)')
            match = pat.match(text)
            data = match.group(1)
            fileName = data[:4]+'-'+data[4:6]
        except:
            self.badFileName.append(text)
            fileName = None
        return fileName  
    # 移动
    def move(self, text):
        try:
            fileName = self.parse(text)
            if fileName == None: return
            if not os.path.isdir(os.path.join(self.dstDir, fileName)):# 判断主目录是否存在子文件夹 
                os.mkdir(os.path.join(self.dstDir,fileName))

            srcPath= os.path.join(self.srcDirDict[text], text)
            dstDir = os.path.join(self.dstDir, fileName)
            shutil.move(srcPath, dstDir)
        except:
            self.duplicateFileName.append(text)
            raise

    @staticmethod
    def decC(dir):
        return os.path.join(self.srcDir,dir)
    # 运行
    def run(self):
        try:
            if not os.path.isdir(self.dstDir):
                os.mkdir(self.dstDir)
            for text in self.findAllJPG():
                print(text)
                self.move(text)
            print('MOVE SUCCESSFUL!') 
        except TypeError:
            raise
# 例子: 将srcDir中的符合parse要求的jpg文件移动到dstDir            
srcDir = r'C:\Users\Administrator\Desktop\2'
dstDir = r'C:\Users\Administrator\Desktop\3'
fmv = MoveFile(srcDir, dstDir, recursive = False)
fmv.run()

可以根据需要,修改程序中的flag和recuesive。

你可能感兴趣的:(python)