对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下

经常下载不同的数据集,发现很多数据集经常是文件夹下有很多子文件夹代表着类别,如1,2,3……,子文件夹下就放着该类的特征文件。因为系统读取文件夹时并不是严格意义上的升序,而是1,10,100……20,21……的形式。要想对这样的特征文件进行重命名并将其放到一个目录下,并且考虑格式的问题,首先要做的就是将父类的文件夹进行重命名。

对子文件夹的命名

原来的文件目录如下:
对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下
用Python写脚本,程序如下:

#coding:utf8
import os
import shutil

def folder_rename(path):
    i = 0
    filelist = os.listdir(path)  # 该文件夹下所有的文件(包括文件夹)
    for files in filelist:  # 遍历所有文件
        i = i + 1
        Olddir = os.path.join(path, files)  # 原来的文件路径
        if os.path.isdir(Olddir):  # 如果是文件夹
            filename = os.path.splitext(files)[0]  # 文件名
            a = int(filename)
            if a < 10:
                b = '00' + filename
            elif a > 9 and a < 100 :
                b = '0' + filename
            else:
                b = filename
            path_1 = path + '/'
            os.rename(path_1 + filename, path_1 + b)
        else:
            continue
path = (r'E:/2019/Cover1000/Cover1000_metadata/CENS')# 全部文件的路径
folder_rename(path)

运行程序即可得到:
对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下

对子文件夹中的文件命名及提取

每个子文件夹下的文件名如下(以其中一个为例):
对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下
其实就是读取文件目录,在遍历时判断是否是文件夹,如果是,则继续遍历该文件夹,然后将这些mat格式的文件进行重命名,格式为:特征名+子文件夹名+读取mat文件的次序。
取出所有mat文件只要复制到目标路径即可。
程序如下:

def file_rename(path,todir):
        i = 0
        filelist=os.listdir(path)#该文件夹下所有的文件(包括文件夹)
        for files in filelist:
            # i=i+1
            Olddir=os.path.join(path,files)
            if os.path.isdir(Olddir):
                sub_path = path + '/' + filelist[i]
                sub_filelist = os.listdir(sub_path)
                j = 1
                for sub_files in sub_filelist:
                    filename = os.path.splitext(sub_files)[0]  # 文件名
                    newname = 'CENs_'+ filelist[i] + '_' + str(j)
                    newpath = sub_path + '/'
                    os.rename(newpath + filename + ".mat", newpath + newname + ".mat")
                    shutil.copy(newpath + newname + ".mat", todir)
                    j = j + 1
                i = i + 1
            else:
                    continue
path = (r'E:/2019/Cover1000/Cover1000_metadata/CENS')# 全部文件的路径
todir = "E:/2019/Cover1000/CENs/"  # 存放复制文件的路径
file_rename(path,todir)

运行程序可以在新的文件夹下得到:
对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下
并且在原来的文件夹中文件也已经重命名:
对所有子文件夹及子文件夹内的文件重命名及提取相应文件到一个目录下

综合以上两个功能,将两个函数写在一起:

#coding:utf8
import os
import shutil

def folder_rename(path):
    i = 0
    filelist = os.listdir(path)  # 该文件夹下所有的文件(包括文件夹)
    for files in filelist:  # 遍历所有文件
        i = i + 1
        Olddir = os.path.join(path, files)  # 原来的文件路径
        if os.path.isdir(Olddir):  # 如果是文件夹
            filename = os.path.splitext(files)[0]  # 文件名
            a = int(filename)
            if a < 10:
                b = '00' + filename
            elif a > 9 and a < 100 :
                b = '0' + filename
            else:
                b = filename
            path_1 = path + '/'
            os.rename(path_1 + filename, path_1 + b)
        else:
            continue

def file_rename(path,todir):
        i = 0
        filelist=os.listdir(path)#该文件夹下所有的文件(包括文件夹)
        for files in filelist:
            # i=i+1
            Olddir=os.path.join(path,files)
            if os.path.isdir(Olddir):
                sub_path = path + '/' + filelist[i]
                sub_filelist = os.listdir(sub_path)
                j = 1
                for sub_files in sub_filelist:
                    filename = os.path.splitext(sub_files)[0]  # 文件名
                    newname = 'CENs_'+ filelist[i] + '_' + str(j)
                    newpath = sub_path + '/'
                    os.rename(newpath + filename + ".mat", newpath + newname + ".mat")
                    shutil.copy(newpath + newname + ".mat", todir)
                    j = j + 1
                i = i + 1
            else:
                    continue

path = (r'E:/2019/Cover1000/Cover1000_metadata/CENS')# 全部文件的路径
todir = "E:/2019/Cover1000/CENs/"  # 存放复制文件的路径
folder_rename(path)
file_rename(path,todir)

功能实现。