从多子文件夹复制指定图片时出现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
相关产品推荐
相关产品推荐

