首页 > 解决方案 > 检索非类型对象不是可迭代错误

问题描述

我有以下代码将视频帧从客户端发送到服务器。我正在以每秒五帧的速度从文件夹中读取帧,然后将帧发送到服务器。我在运行代码时检索错误。

INTERVAL_DELAY = 0.25
SERVER_A_ADDRESS = "tcp://localhost:5555"
SERVER_A_TITLE = "Server A"
context = zmq.Context()
socket_server_a = context.socket(zmq.PUSH)
socket_server_a.connect(SERVER_A_ADDRESS)
destination = {
 "currentSocket": socket_server_a,
 "currentServersTitle": SERVER_A_TITLE}
running = True
frame_count = 0
def send_frame(frame, frame_count):
 global destination, running
  try:
    frame = cv2.resize(frame, (224, 224))
    encoded, buffer = cv2.imencode('.jpg', frame)
    jpg_as_text = base64.b64encode(buffer)
    destination["currentSocket"].send(jpg_as_text)
  except Exception as Error:
    print(Error)
    running = False
def main():
  global destination, running, frame_count
  filenames = [img for img in glob.glob("video-frames/*.jpg")]
  fps = 5
  interval = int(1 / fps)
  while running:
    filenames = sorted(filenames, key=os.path.getctime) or filenames.sort(key=os.path.getctime)
    for img in filenames:
        frame = cv2.imread(img)
        frame_count += 1
        threading.Thread(target=send_frame, args=(frame, frame_count)).start()
        time.sleep(interval)
    time.sleep(INTERVAL_DELAY)
  destination["currentSocket"].close()
  destination["pendingSocket"].close()
if __name__ == "__main__":
  main()

检索错误:

 for img in filenames:
 TypeError: 'NoneType' object is not iterable

谢谢

标签: pythonpython-3.x

解决方案


sorted(lst)是一个返回新列表的函数。

lst.sort()对列表进行适当的排序,并且没有任何内容可返回,因此它返回None.

a or b评估允许决定它是真还是假的第一件事。

如果您的filenames列表不为空,sorted(filenames, key=os.path.getctime)则不会为空,因此在布尔上下文中将其视为 True。由于整个条件是肯定的Truesorted(filenames, key=os.path.getctime) or filenames.sort(key=os.path.getctime)计算为sorted(filenames, key=os.path.getctime)

如果filenames为空,则为sorted(filenames, ...)空列表,即认为是假的。因此,必须评估第二部分sort(...)以决定整个or表达式。它返回None,最终确定整体的真实性,评估为决定性的价值,None.

你的情况就是这样。

因此,只需删除最后一部分并使用:

filenames = sorted(filenames, key=os.path.getctime)

推荐阅读