基于CSV标签批量移动图片至对应文件夹时遇复制失败错误求助
问题描述
我有一个包含多张图片的数据集,还有一个CSV文件,其中一列是图片名称,另一列是对应标签。我想把图片按标签归类到对应文件夹里,但操作失败,抛出了“无法复制文件”的错误。
我的实现代码
from __future__ import print_function import pandas as pd import shutil import os import sys labels = pd.read_csv(r'c:\technocolab project2\img_quantity.csv') train_dir = r'c:\technocolab project2\archive\img' label = r'c:\technocolab project2\DR\label' if not os.path.exists(label): os.mkdir(label) for filename, class_name in labels.values: # Create subdirectory with `class_name` if not os.path.exists(label + str(class_name)): os.mkdir(label + str(class_name)) src_path = os.path.join(train_dir + str(filename) + '.jpg') dst_path = os.path.join(label + str(class_name) + str(filename) + '.jpg') try: shutil.move(src_path, dst_path) print("sucessful") except IOError as e: print('Unable to copy file {} to {}' .format(src_path, dst_path)) except: print('When try copy file {} to {}, unexpected error: {}' .format(src_path, dst_path, sys.exc_info()))
错误提示
error: unable to copy files
错误截图:
问题分析与解决
你的代码存在几处路径拼接的核心错误,这是导致文件无法复制的主要原因:
os.path.join用法错误:该函数需要传入多个独立的路径片段,而你先把路径和文件名硬拼接成字符串再传入,会导致路径缺少分隔符(比如变成c:\technocolab project2\archive\img123.jpg),系统无法识别正确路径。- 类别文件夹路径错误:创建子文件夹时,
label + str(class_name)没有添加路径分隔符,会生成c:\technocolab project2\DR\label0这类错误路径,系统找不到对应文件夹,自然无法完成文件移动。
修正后的代码
from __future__ import print_function import pandas as pd import shutil import os import sys labels = pd.read_csv(r'c:\technocolab project2\img_quantity.csv') train_dir = r'c:\technocolab project2\archive\img' label_root = r'c:\technocolab project2\DR\label' if not os.path.exists(label_root): os.makedirs(label_root) # 用makedirs支持多级目录创建,容错性更强 for filename, class_name in labels.values: # 正确拼接类别文件夹路径 class_dir = os.path.join(label_root, str(class_name)) if not os.path.exists(class_dir): os.makedirs(class_dir) # 正确拼接源文件和目标文件路径 src_path = os.path.join(train_dir, f"{filename}.jpg") dst_path = os.path.join(class_dir, f"{filename}.jpg") try: # 先检查源文件是否存在,避免无效报错 if os.path.exists(src_path): shutil.move(src_path, dst_path) print(f"成功移动文件: {filename}.jpg") else: print(f"源文件不存在: {src_path}") except IOError as e: print(f"无法复制文件 {src_path} 到 {dst_path},错误信息: {e}") except Exception as e: print(f"移动文件 {src_path} 到 {dst_path} 时出现意外错误: {e}")
额外注意事项
- 确认CSV的
filename列没有带.jpg后缀,否则会生成xxx.jpg.jpg这类错误文件名; - 检查源文件夹
train_dir内确实存在对应图片; - 确保程序拥有源文件夹和目标文件夹的读写权限,避免因权限不足导致操作失败。
内容的提问来源于stack exchange,提问作者shivam234556
相关产品推荐
相关产品推荐

