基于Excel文件名复制文件时触发FileNotFoundError[WinError3]求助
问题解决与代码优化
错误原因拆解
- 路径不完整:
os.listdir()返回的只是文件名,不是完整路径。直接用i作为源路径时,Python会在脚本运行的当前目录找文件,自然找不到Test.pdf。 - 函数用错:
shutil.copytree()是用来复制整个目录的工具,你要复制单个文件,得用shutil.copy()或者shutil.copy2()(后者会保留文件创建时间等元数据)。 - Excel数据读取错误:直接遍历
condition这个DataFrame对象,拿到的是Excel的列名,不是你要匹配的文件名列表,等于做了无效循环。 - 循环效率低:两层循环逐个比对,不如先把目标文件名转成集合,判断速度更快。
修正后的代码
import os import shutil import pandas as pd # 设置输入输出目录(用原始字符串避免转义麻烦) input_dir = r"C:\Users\Asus\Desktop\Python\Input" output_dir = r"C:\Users\Asus\Desktop\Python\Output" # 确保输出目录存在,避免复制时因目录不存在报错 os.makedirs(output_dir, exist_ok=True) # 读取Excel中的目标文件名,假设Excel里存文件名的列叫"文件名" # 替换成你实际的列名,比如"Filename" condition_df = pd.read_excel(r"C:\Users\Asus\Desktop\Python\Condition.xlsx") # 去重+过滤空值,转成集合提升判断效率 target_filenames = set(condition_df["文件名"].dropna().tolist()) # 遍历输入目录下的所有条目 for filename in os.listdir(input_dir): # 拼接完整的源文件路径 src_path = os.path.join(input_dir, filename) # 只处理文件,跳过子目录 if os.path.isfile(src_path): # 判断当前文件名是否在目标列表中 if filename in target_filenames: print(f"正在复制: {filename}") # 拼接输出路径 dst_path = os.path.join(output_dir, filename) # 复制文件(copy2保留文件元数据) shutil.copy2(src_path, dst_path)
额外优化建议
- 始终用
os.path.join()拼接路径,避免手动写斜杠导致的跨平台问题或路径错误。 - 提前创建输出目录,
os.makedirs(..., exist_ok=True)可以自动处理目录已存在的情况。 - 过滤Excel中的空值和重复文件名,减少无效判断。
- 增加
os.path.isfile()判断,防止误把输入目录里的子目录当成文件处理。
内容的提问来源于stack exchange,提问作者mayliew
相关产品推荐
相关产品推荐

