在之前的拷贝U盘数据的程序中,基本实现了U盘的读取,拷贝,上传服务器的操作,但是在实际使用中,拷贝所有的文件会对资源造成巨大的占用,并且拷贝的文件并不全是我们需要的,仅仅只需要几个类型的文件而已,那么,我们就需要对拷贝的文件进行筛选。
一、分析
程序开始运行,询问用户是否需要自定义拷贝文件类型。
文件分为两种,有后缀的各种类型的文件及无后缀的文件。
用户输入时可能为.### 或 ###,所以要将两种情况都考虑到。
二、代码实现
首先需要对用户进行询问,进行各种确认操作,
typeList = [] #拷贝文件类型列表
CustomizeType = False #是否自定义拷贝文件类型
NoSuffixFile = False #是否拷贝无后缀文件,默认为false
'''
确定拷贝的文件类型
'''
def getFileTypes():
while True: #输入不合法无限循环
customizeType = input('是否要自定义拷贝类型?(不自定义则默认拷贝所有文件)(Y/N)').upper()
if customizeType == 'Y' or customizeType == 'N':
if customizeType == 'Y': #自定义拷贝类型
global CustomizeType
CustomizeType = True
while True:
copyType = input('请输入要拷贝的类型:')
copyType = copyType.replace('.','\.') #这里先将所有的‘.’进行替换,防止后面使用正则表达式出现错误
typeList.append(copyType) #添加到列表中
while True:
again = input('是否继续添加?(Y/N)').upper()
if again == 'Y' or again == 'N':
if again == 'Y':
break
else:
while True: #选择是否拷贝无后缀文件
NoSuffixFileFlag = input('是否复制无后缀文件?(Y/N)').upper()
if NoSuffixFileFlag == 'Y' or NoSuffixFileFlag == 'N':
if NoSuffixFileFlag == 'Y':
global NoSuffixFile
NoSuffixFile = True #拷贝无后缀文件
print(NoSuffixFile)
return
else:
return
else:
return
在复制文件时对每个文件进行判定是否为指定类型文件:
'''
从sourcepath上传文件和目录到targetPath
'''
def copyfile(sourcePath,targetPath,threadName):
for f in os.listdir(sourcePath):
print(f)
if(f == 'System Volume Information'): #过滤系统文件夹
continue
f1 = os.path.join(sourcePath,f) #连接源文件(目录)名
f2 = targetPath+'/'+f#连接目标文件(目录)名,
if os.path.isfile(f1): #如果为文件,则进行复制操作
if CustomizeType:
if isCustomizeType(f):
print(threadName+'正在上传文件: '+f1)
sftp.put(f1,f2)
print(threadName+'文件: '+f1+' 上传完成')
else:
print(threadName+'正在上传文件: '+f1)
sftp.put(f1,f2)
print(threadName+'文件: '+f1+' 上传完成')
else: #如果为目录,创建新一级的目标目录,并递归操作
print(threadName+'正在创建目录: '+f2)
sftp.mkdir(f2)
print(threadName+'目录: '+f2+' 创建完成')
copyfile(f1,f2,threadName)
文件类型匹配函数:
'''
将文件名与所选择的文件类型进行匹配
'''
def isCustomizeType(fileName):
for fileType in typeList:
if re.match('^\\\..*',fileType): #如果是\.开头,说明用户输入为.###
if re.match('.*'+fileType+'$',fileName):
return True
else:
if re.match('.*\.'+fileType+'$',fileName):
return True
if NoSuffixFile:
if not fileName.count('.'):#判断是否为无后缀文件
print('NosuffixFile')
return True
return False
三、运行结果
这是U盘中的文件,可以看到,只上传了后缀为.docx和无后缀的文件,用户可以根据自己的需要拷贝不同的文件类型。