Python3.7 非空文件夹内容分类和删除

       最近在做相关EPLAN三维布线的工作,其中需要将从各个公司下载的库文件进行分类,发现各个库文件夹结构的排布是如左图蓝框内类似的二级分类,然而在EPLAN中库的相关文件夹结构如右图橙框进行的二级分类,所以需要做一个文件的移动。利用Python的os, shutil库大量进行这些元件库的移动操作。

Python3.7 非空文件夹内容分类和删除_第1张图片

                                                                             图一 下载元件库文件夹结构(左图)和EPLAN库文件夹结构(右图)

       最先完成的是复制的工作,重新建立了一个名为EPLAN_Beckhoff_Library的空文件夹,将复制的库文件按照图一右图文件夹结构进行文件复制。这里用到了Python自带的os,shutil库。

       所下载的库文件存放于G:\Beckhoff

       EPLAN库文件夹地址为G:\ELPAN_Beckhoff_Library

import os,shutil
SentMainAddress = 'G:\Beckhoff'#所下载库文件存放位置
ReceiveMainAddress = 'G:\ELPAN_Beckhoff_Library'#EPLAN库文件将要存放的位置

#遍历该文件夹内查看有多少文件夹,进行循环(Accessories, Bus_Coupler, Bus_Terminal)
for fn in os.listdir('G:\Beckhoff'):
    #遍历子文件夹查看有多少种分类(dwg,dxf,igs,pdf,stp)
    for kind in os.listdir(os.path.join(SentMainAddress,fn)):
        #文件源地址(e.g.:G:\Beckhoff\Accessories\dwg)
        OriginFilefolder = os.path.join(SentMainAddress,fn,kind)
        #文件复制目标地址(e.g.:G:\ELPAN_Beckhoff_Library\dwg\Accessories)
        FinnalFilefolder = os.path.join(ReceiveMainAddress,kind,fn)
        #判断文件夹是否存在
        if(os.path.exists(OriginFilefolder)):
           print('true')
           #复制文件夹,并将文件夹内的文件存放在以存放地址最后一个节点名称命名的新建文件夹
           shutil.copytree(OriginFilefolder,FinnalFilefolder)
        else:
           print('false')
           print('Doesn\'t have this origin file address')
           print(FinnalFilefolder)

        当我移动完文件后发现一个问题,源文件并没有删除,但是还有一部分文件由于不是按照这个文件夹结构保存的,没有被复制过来,需要利用其他方式进行移动。如何做到删除那些已经复制过来分好类的文件,而不删除没有被复制的文件成为了下一个要解决的问题。

       这里想到的方法是既然都已经复制过来了,那就对库文件夹地址与EPLAN库文件夹地址进行存在性测试,如果在两个相应的地址下子文件夹是存在的,就认定文件已经被复制过来,便进行删除操作。删除相应的库文件夹时,先删除文件夹中所有文件,后删除空文件夹,在不断的所搜后没有发现可以直接删除非空文件夹的操作,师姐也告诉我在任何语言下的操作中没有直接删除非空文件夹的操作,删除使用的是递归删除方式但是目前我还是对于递归的印象很陌生,为了图快还是使用的是遍历的方式进行删除。

#遍历所下载的库文件夹中的子文件夹
for fn in os.listdir(SentMainAddress):
    #遍历子文件夹,下属分类文件夹
    for kind in os.listdir(os.path.join(SentMainAddress,fn):
        OriginFilefolder = os.path.join(SentMainAddress,fn,kind)
        FinnalFilefolder = os.path.join(ReceiveMainAddress,kind,fn)
        #若源地址子文件夹下的下属文件夹与EPLAN库中相对应的文件夹均存在,
        #则可以进行源文件删除操作
        if(os.path.exists(OriginFilefolder)&os.path.exists(FinnalFilefolder)):
            print(OriginFilefolder)
            #删除文件夹下文件
            for Filename in os.listdir(OriginFilefolder):
                os.remove(os.path.join(OriginFilefolder,Filename))
            #删除下属文件夹
            shutil.rmtree(OriginFilefolder)
            print('remove finnished')
        #删除子文件夹
        shutil.rmtree(os.path.join(SentMainAddress,fn))
        else:
            print('Sorry, it can\'t be removed\n', OriginFilefolder,'\n',FinnalFilefolder)

这里面需要特别注意的是:

os.path.join(path,path,...)

该函数为路径拼接函数,在进行操作时,地址(path)格式应为X:\xxxx\xxxx\xxx,以反斜杠进行文件夹级别区分。

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)

该函数为文件夹复制函数,参数只需要填所要复制的文件夹源地址(src),复制目标地址(dst),即可。但注意目标地址不可以存在与新建文件夹相同名字的文件夹,会报错。

你可能感兴趣的:(Python)