python自顶向下读取所有文件夹与文件

讨论 我不是赌鬼
Lv5 宗师级炼丹师
发布在 综合   988   0
讨论 我不是赌鬼   988   0

    最近,同事为公司重新设计了DWG文件的管理方案,具体方案如下:

    所有文件都存在名为ROOT的文件夹下,该文件夹包含一级分类,将不同的部件分别存于不同的文件夹中, 这些文件夹里会包含一些DWG文件,除此之外还可以包含三级分类的文件夹...依次类推

    现在,公司有一批DWG文件需要进行处理,这些文件名写在EXCEL中的某一列。同事希望我写一个脚本,让我把 EXCEL中提到的DWG文件从ROOT文件夹内拷贝到指定文件夹

    我拍了拍脑门,就确定了以下解决问题的方案:

    1. 使用openpyxl库读取需要使用的DWG列表
    2. 将ROOT下的各级文件都以folder:file形式存储在字典中
    3. 判断指定的DWG文件是否在字典中,如果是,则根据字典里的地址复制一份文件到指定文件夹。
    from openpyxl import *
    
    #打开存储DWG列表的excel文件,文件名为EXCEL_NAME
    wb = load_workbook(EXCEL_NAME)
    #我发现里面只有一个worksheet,所以用wb.active指定
    ws = wb.active
    
    #数据存储在第2列,从第1行开始,不知道在哪一行结束
    row =1
    column=2
    
    #创建list记录DWG列表
    file_list=[]
    
    #开始循环,知道指定的单元格的数值为None时跳出循环
    while True:
        #指定单元格
        cell=ws.cell(row=row,column=column)
        #如果单元格内存在数值(文字)
        if cell.value != None:
            #由于EXCEL中没存后缀所以自己加
            file_list.append(cell.value+'.DWG')
            row=row+1
        else:
            break
    

    DWG采集完成后,剩下的字典创建让我着实想了挺久,主要是过去重没写过迭代。总的思路是...emm,直接上代码吧。

    #创建字典
    file_dict={}
    
    def creat_dict():
        #本级只有1个文件夹
        folder_num=1
        #本级的文件夹列表
        folder_list=[ROOT_FOLDER]
        #如果本级的文件夹数目不是0,则继续迭代
        while folder_num != 0:
            folder_list,folder_num=update_dict(folder_list)
    
    #迭代,输入参数为上级文件夹列表
    def update_dict(font_folder_list):
        #初始化本级没有文件夹
        folder_list=[]
        folder_num=0
        #遍历上级文件夹列表的所有文件夹
        for font_folder in font_folder_list:
            #遍历该文件夹内的文件
            for file_or_folder in os.listdir(font_folder):
                #补全地址
                file_or_folder=font_folder+'\\'+file_or_folder
                #判断是否是文件夹,如果是
                if os.path.isdir(file_or_folder):
                    #新建一个key
                    file_dict[file_or_folder]=[]
                    #本级文件夹数目自增
                    folder_num=folder_num+1
                    #记录本级文件夹名
                    folder_list.append(file_or_folder)
                else:
                    #将文件名作为值登记在font_folder中
                    file_dict[font_folder].append(file_or_folder)
    
        #返回本级文件夹列表与文件夹数目
        return folder_list,folder_num

    最后,进行文件复制

    for file in file_list:
        for folder in list(file_dict.keys()):
            file_addr=folder+'\\'+file
            if  file_addr in file_dict[folder]:
                try:
                    new_file=DESTINATION_ADDR+'\\'+file
                    shutil.copyfile(file_addr,new_file)
                except Exception as e:
                    repr(e)
    
    版权声明:作者保留权利,不代表意本站立场。如需转载请联系本站以及作者。

    参与讨论

    回复《 python自顶向下读取所有文件夹与文件

    EditorJs 编辑器

    沙发,很寂寞~
    反馈
    to-top--btn