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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:01:09