You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:24:03