在之前的拷贝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盘python环境 python u盘管理_Python


u盘python环境 python u盘管理_文件类型_02


u盘python环境 python u盘管理_自定义_03


这是U盘中的文件,可以看到,只上传了后缀为.docx和无后缀的文件,用户可以根据自己的需要拷贝不同的文件类型。