Python图片写入脚本失效:路径单斜杠致cv2.imwrite失败
解决cv2.imread/imwrite路径单斜杠导致图片读取为空、写入失败的问题
我看到你在编写从CSV提取对应图片到指定目录的Python脚本时,遇到了路径相关的麻烦——用cv2.imwrite时单斜杠路径无法正常工作,而且加载路径自动转成单斜杠后,img变成了空类型。这其实是Windows系统路径分隔符和Python字符串转义规则冲突导致的常见坑,咱们来一步步解决它:
问题根源
Windows系统用**反斜杠\**作为路径分隔符,但在Python字符串里,\是转义字符(比如\n代表换行、\t代表制表符)。你手动拼接路径时用的"\\"虽然能勉强生效,但一旦拼接逻辑复杂,很容易出现转义错误,导致cv2.imread无法识别有效路径,返回空的img对象,自然cv2.imwrite也会失败。
解决方案
1. 用os.path.join拼接路径(最推荐,跨平台)
Python的os.path模块会自动根据操作系统选择正确的路径分隔符,完全避免手动拼接的错误。把你代码里所有路径拼接的地方都改成os.path.join:
2. 用原始字符串或正斜杠简化路径
如果不想用os.path,可以在路径字符串前加r(原始字符串),让Python不解析转义字符;或者直接用正斜杠/,Python和OpenCV都支持用正斜杠作为路径分隔符。
3. 增加空图片检查
在写入前判断img是否为空,避免无效写入,同时能排查读取失败的路径。
修改后的完整代码
import os import pandas as pd import cv2 # 读取CSV文件 file = pd.read_csv("csv4.csv") current_dir = os.getcwd() # 用os.path.join拼接基础图片路径 img_root_path = os.path.join(current_dir, "kaggle_35000") # 目标目录 destination_root = os.path.join("D:/image_extract_python/result/kaggle_stage0") # 确保目标目录存在,不存在则创建 os.makedirs(destination_root, exist_ok=True) kaggle_folders = os.listdir(img_root_path) for folder_name in kaggle_folders: folder_path = os.path.join(img_root_path, folder_name) print(f">>>>>>>>>>>>>>>>当前处理的主文件夹: {folder_name}<<<<<<<<<<<<<<<<<<<<<<<<<") img_files = os.listdir(folder_path) for img_name in img_files: print(f"正在检查文件夹 {folder_name} 中的图片: {img_name}") # 遍历CSV中的每行数据,替换原来的range循环,更直观高效 for idx, row in file.iterrows(): # 构建CSV中对应的图片文件名 target_img_name = f"{str(row['16_left'])}.jpeg" if img_name == target_img_name: # 构建完整的图片读取路径 img_read_path = os.path.join(folder_path, img_name) img = cv2.imread(img_read_path, 1) # 检查图片是否读取成功 if img is not None: # 构建写入路径 img_write_path = os.path.join(destination_root, img_name) cv2.imwrite(img_write_path, img) print(f"已成功写入文件: {img_name}") else: print(f"读取图片失败,路径无效: {img_read_path}")
额外优化点
- 移除了冗余的
list=[]和list=file代码,直接使用file即可 - 增加了
os.makedirs(destination_root, exist_ok=True),确保目标目录不存在时会自动创建,避免写入时的目录不存在错误 - 用
f-string替换了字符串拼接,代码更简洁易读 - 把循环遍历CSV的方式改成
iterrows(),逻辑更直观,也更容易维护
内容的提问来源于stack exchange,提问作者sachsom
相关产品推荐
相关产品推荐

