今天在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。