cv2.imread读取新复制粘贴到监控文件夹的图片时出现AttributeError错误
问题诱因
你遇到的报错本质是文件未完成写入就被提前读取:
- 剪切粘贴操作本质是操作系统修改文件系统的节点指针,几乎在瞬间完成,不存在长时间的文件写入过程,所以脚本读取时文件已经处于可用状态。
- 复制粘贴操作需要把完整的文件数据写入目标路径,写入过程中文件会被操作系统锁定,此时
cv2.imread读取不完整的损坏文件会直接返回None,后续调用size属性就会触发AttributeError。 - 脚本启动前就存在的文件已经完成写入,自然不会触发该问题。
解决方案
可以根据你的使用场景选择以下任意一种方案,也可以组合使用:
1. 增加读取结果校验
最简单的临时修复方案,读取后判断图片对象是否为None,无效则跳过当前轮次的处理,等待下一次循环再尝试读取:
import os while (True): for _, _, files in os.walk(source): for file in files: # 优先用os.path.join拼接路径,避免不同操作系统的路径分隔符兼容问题 img = cv2.imread(os.path.join(source, file)) if img is None: continue print(img.size)
2. 增加延迟重试机制
针对大文件复制场景,可以给读取逻辑增加重试次数和间隔,避免偶发的写入未完成问题:
import os import time MAX_RETRY = 3 RETRY_GAP = 0.3 # 每次重试间隔0.3秒,可按需调整 while (True): for _, _, files in os.walk(source): for file in files: file_path = os.path.join(source, file) img = None for _ in range(MAX_RETRY): img = cv2.imread(file_path) if img is not None: break time.sleep(RETRY_GAP) if img is None: # 可在这里增加日志记录,提示该文件多次读取失败,跳过处理 continue print(img.size)
3. 替换为专业文件监控方案
自定义死循环扫描的逻辑本身性能差、事件捕获准确度低,你可以换成watchdog这类专业的文件监控库,可以直接监听文件写入完成的事件,从根源避免提前读取的问题。
内容的提问来源于stack exchange,提问作者Cheang Wai Bin
相关产品推荐
相关产品推荐

