如何解决cv2.imwrite()写入含特殊字符文件路径时报错的问题
问题原因
- OpenCV的
cv2.imwrite()接口底层由C++实现,Windows环境下默认无法正确解析包含中文等非ASCII字符的文件路径,即使路径对应的父目录真实存在,也会抛出FileNotFoundError异常,这是OpenCV已知的路径编码兼容问题。 - 若纯英文昵称场景也偶发该报错,可检查拼接路径时
ocrdata目录是否已创建,建议通过代码自动创建目录避免手动创建遗漏。
解决方案
优先推荐使用cv2.imencode()配合Python原生文件操作实现保存,该方案兼容性最强,全平台都支持含特殊字符的路径:
import os import cv2 # 拼接路径优先用os.path.join,避免不同系统斜杠不兼容问题 save_dir = os.path.join(saveroot, "ocrdata") # 自动创建目录,exist_ok=True表示目录已存在时不报错 os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, f"{playername}-{imgtype}.png") # 编码为对应格式的内存流,第一个参数为带点的文件后缀 ret, img_encode = cv2.imencode(f".{imgtype}", var) if ret: # 用Python原生IO写文件,完美支持Unicode路径 with open(save_path, "wb") as f: f.write(img_encode.tobytes())
额外注意项
如果玩家昵称中包含/ \ : * ? " < > |等系统禁止作为文件名的特殊字符,建议提前替换为下划线等合法字符,避免所有保存方案都失效:
import re # 替换非法文件名字符 playername = re.sub(r'[\/:*?"<>|]', '_', playername)
内容的提问来源于stack exchange,提问作者Pythonista
相关产品推荐
相关产品推荐

