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

从多子文件夹复制指定图片时出现FileNotFoundError问题求助

解决Python批量复制指定图片时的FileNotFoundError问题

我有一个记录待复制图片名称的文本文件cat_fam.txt,需要将源文件夹X:\animals(包含cats_1、cats_2、tigers_1、lions_1、lions_2等子文件夹)中的指定图片复制到目标文件夹X:\images\cat_family。执行以下Python代码时出现FileNotFoundError:

import os
import shutil
src = r'X:\animals' #source with multiple sub-folders
dest = r'X:\images\cat_family' #destination folder
with open('cat_fam.txt') as file: #text file containing the image names
for path, subdirs, files in os.walk(src):
    for name in file:
        file_name  = name.strip()
        filename = os.path.join(path, file_name)
        shutil.copy2(filename, dest)

报错信息如下:

File "C:\Users\AppData\Local\Temp\2/ipykernel_30556/2100413787.py", line 6, in <module>
    shutil.copy2(filename, dest)

  File "C:\Users\AppData\Local\Continuum\anaconda3\envs\tf2.7\lib\shutil.py", line 266, in copy2
    copyfile(src, dst, follow_symlinks=follow_symlinks)

  File "C:\Users\AppData\Local\Continuum\anaconda3\envs\tf2.7\lib\shutil.py", line 120, in copyfile
    with open(src, 'rb') as fsrc:

FileNotFoundError: [Errno 2] No such file or directory: 'X:\\animals\\lion_2345.jpg'

问题原因

  • 逻辑顺序错误:原代码嵌套关系混乱,for name in file只会读取一次文件内容,第一次遍历子目录就把文件读完了,后续遍历无法获取新文件名;同时默认目标文件都在当前遍历的path目录下,但实际图片可能在任意子文件夹,直接拼接路径必然找不到。
  • 缺少目标文件夹预处理:如果目标文件夹不存在,复制操作也会报错,虽然本次不是这个问题,但提前创建更稳妥。
  • 无异常处理:没有考虑cat_fam.txt里的文件名拼写错误、文件实际不存在的情况,直接复制会触发异常。

修复后的代码

import os
import shutil

src = r'X:\animals'
dest = r'X:\images\cat_family'

# 确保目标文件夹存在,已存在则不报错
os.makedirs(dest, exist_ok=True)

# 读取所有待复制文件名到集合,去重且查找更快
with open('cat_fam.txt', 'r') as file:
    target_files = {name.strip() for name in file if name.strip()}

# 遍历源目录下的所有文件,匹配目标文件名
for path, subdirs, files in os.walk(src):
    for file_name in files:
        if file_name in target_files:
            src_full_path = os.path.join(path, file_name)
            dest_full_path = os.path.join(dest, file_name)
            # 避免重复复制(可选)
            if not os.path.exists(dest_full_path):
                shutil.copy2(src_full_path, dest_full_path)
            # 移除已找到的文件,减少后续匹配次数
            target_files.remove(file_name)
            # 所有文件找到后提前退出,节省时间
            if not target_files:
                break
    if not target_files:
        break

# 输出未找到的文件,方便排查
if target_files:
    print("未找到以下文件:")
    for missing_file in target_files:
        print(missing_file)

代码说明

  • 先读取目标文件名集合:集合的查找效率远高于列表,能快速判断当前文件是否需要复制。
  • 正确遍历匹配:遍历源目录下的每个文件,找到匹配项后再拼接正确路径复制,彻底解决原代码路径拼接错误的问题。
  • 预处理目标文件夹:用os.makedirs确保目标文件夹存在,无需手动创建。
  • 性能优化:找到文件后从集合中移除,一旦集合为空就提前终止遍历,减少不必要的资源消耗。
  • 错误排查:最后输出未找到的文件,方便定位拼写错误或文件缺失的情况。

内容的提问来源于stack exchange,提问作者shiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:40:24