You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:37