最近,同事为公司重新设计了DWG文件的管理方案,具体方案如下:
所有文件都存在名为ROOT的文件夹下,该文件夹包含一级分类,将不同的部件分别存于不同的文件夹中, 这些文件夹里会包含一些DWG文件,除此之外还可以包含三级分类的文件夹...依次类推
现在,公司有一批DWG文件需要进行处理,这些文件名写在EXCEL中的某一列。同事希望我写一个脚本,让我把 EXCEL中提到的DWG文件从ROOT文件夹内拷贝到指定文件夹
我拍了拍脑门,就确定了以下解决问题的方案:
- 使用openpyxl库读取需要使用的DWG列表
- 将ROOT下的各级文件都以folder:file形式存储在字典中
- 判断指定的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)