Python实现Excel匹配文件夹并复制功能遇阻求助
问题:匹配Excel姓名并复制对应文件夹
我折腾这个功能好几天,一点进展都没有。需求很明确:检查嵌套目录里的文件夹名称是否存在于Excel表格中,存在的话就把该文件夹复制到另一个目录。但作为Python新手,我彻底卡壳了。
数据示例
Excel中的姓名格式
[mike nicolai Tesla, Thomas Edison, Edie Morphy, Josef mike Tesla Johanssen]
目录结构格式(路径最后一段为lastName, first Name)
R:\this folder\docs\GERMANY\Tesla Johanssen, Josef mike R:\this folder\docs\GERMANY\Morphy, Edie R:\this folder\docs\France\nicolai Tesla, Josef mike
我编写的代码
为处理中间名的姓名提取和复制逻辑,我写了sort_Names(_name)和extract_Names_From_Folders(folder_path)两个函数:
import os from glob import glob import shutil def extract_Names_From_Folders(folder_path): folder_Name=folder_path.split(sep="\\") folder_Name=folder_Name[-1::] if len(''.join(map(str, folder_Name)).split(' '))>2: _lName=''.join(map(str, folder_Name)).split(" ")[0] _mName=''.join(map(str, folder_Name)).split(" ")[1] _fName=''.join(map(str, folder_Name)).split(" ")[2] return _fName,_mName,_lName elif len(''.join(map(str, folder_Name)).split(' '))>1: _lName=''.join(map(str, folder_Name)).split(" ")[0] _fName=''.join(map(str, folder_Name)).split(" ")[1] return _fName,_lName elif len(''.join(map(str, folder_Name)).split(' '))>0: _fName=''.join(map(str, folder_Name)).split(" ")[0] return _fName def sort_Names(_name): if len(''.join(map(str, _name)).split(" "))==4: excel_fName2=''.join(map(str, _name)).split(" ")[3] excel_fName1=''.join(map(str, _name)).split(" ")[2] excel_mName= ''.join(map(str, _name)).split(" ")[0] excel_lName=''.join(map(str, _name)).split(" ")[1] return excel_fName1,excel_fName2,excel_mName,excel_lName elif len(''.join(map(str, _name)).split(" "))==3: excel_fName=''.join(map(str, _name)).split(" ")[2] excel_mName= ''.join(map(str, _name)).split(" ")[0] excel_lName=''.join(map(str, _name)).split(" ")[1] return excel_fName,excel_mName,excel_lName elif len(''.join(map(str, _name)).split(" "))==2: excel_fName=''.join(map(str, _name)).split(" ")[1] excel_lName=''.join(map(str, _name)).split(" ")[0] return excel_fName,excel_lName elif len(''.join(map(str, _name)).split(" "))==1: excel_fName=''.join(map(str, _name)).split(" ")[0] return excel_fName else: return [0] def copy_the_file(folder_name,_name,df): index = _name.index(folder_name) df.at[_name, "User Request Form Created?\n[Yes/No]"] = "Yes" # 复制子文件夹到Proof目录 proof_folder_path = r"r:\blabla\Proof" shutil.copytree(folder_name, os.path.join(proof_folder_path, _name), dirs_exist_ok=True)
下面是主逻辑代码,但完全跑不起来,我也找不到问题所在。代码越写越复杂,肯定有更简洁、更符合Python风格的写法,但我摸不着头绪:
import pandas as pd from glob import glob # 设置文件路径 excel_file_path = r"k:\blabla\path.xlsx" folder_path = r"r:\blabla\path\*\*" df = pd.read_excel(excel_file_path, header=1) # 提取Excel中"Name"列的姓名列表 names = df["Name"].tolist() for folder_name in glob(folder_path, recursive = True): # 检查函数返回的元组长度(判断是否有中间名) mName='' tuple_=extract_Names_From_Folders(folder_name) if len(tuple_) == 3: fName = tuple_[0] if tuple_ else None mName= tuple_[1] if len(tuple_) > 1 else None lName= tuple_[2] if len(tuple_) > 2 else None elif len(tuple_) == 2: fName = tuple_[0] if tuple_ else None lName= tuple_[1] if len(tuple_) > 1 else None elif len(tuple_) == 1: fName = tuple_[0] if tuple_ else None # 遍历Excel中的每个姓名进行匹配 for _name in names: if len(_name)>2: tuple_=sort_Names(_name) if len(tuple_) == 4: excel_fName2=tuple_[1] if tuple_ else None excel_fName1=tuple_[0] if tuple_ else None excel_mName= tuple_[2] if tuple_ else None excel_lName=tuple_[3] if tuple_ else None print(excel_fName1+' '+excel_fName2,excel_mName+' '+excel_lName) # 检查文件夹姓名与Excel姓名是否匹配 if excel_fName1+' '+excel_fName2 == fName and excel_mName+" "+excel_lName == lName: copy_the_file(folder_name,_name,df) if len(tuple_) == 3: excel_fName=tuple_[0] if tuple_ else None excel_mName= tuple_[1] if tuple_ else None excel_lName=tuple_[2] if tuple_ else None print(excel_fName+' '+excel_mName,excel_lName) if excel_fName == fName and excel_mName+" "+excel_lName == lName: copy_the_file(folder_name,_name,df) elif len(tuple_) == 2: excel_fName = tuple_[0] if tuple_ else None excel_lName = tuple_[1] if len(tuple_) > 1 else None print(excel_fName +' '+excel_lName) if excel_fName==fName and excel_lName == lName: copy_the_file(folder_name,_name,df) elif len(tuple_) == 1: fName = tuple_[0] if tuple_ else None
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

