MQTT多主题订阅CSV写入异常:如何匹配主题与对应Payload?
解决MQTT消息与主题匹配写入CSV的问题
你的代码问题在于每次收到任意主题的消息时,都硬编码写入了三个主题和同一个Payload,完全没有关联实际收到的消息所属主题。要实现每个主题对应自身Payload写入,只需要利用MQTT回调里msg对象自带的主题信息即可,修正后的代码如下:
def on_message(client, userdata, msg): # 提取当前消息主题的最后一段 topic_name = msg.topic.rsplit('/', 1)[-1] # 解码消息内容 payload = msg.payload.decode("utf-8") # 打开文件并写入当前主题与对应Payload with open(r'file.csv', 'a+', newline='') as f: # 用逗号分隔符合CSV标准格式,若需要空格可替换为' ' f.write(f"{topic_name},{payload}\n")
核心修正点:
- 不再依赖硬编码的
topic/topic2/topic3变量,直接通过msg.topic获取当前消息的真实主题 - 仅写入当前消息对应的主题与Payload,避免无关内容重复写入
- 合并文件操作,只打开一次文件,减少不必要的IO开销
- 改用逗号作为分隔符,符合CSV文件的规范(如果你的业务场景确实需要空格分隔,将逗号替换为空格即可)
内容的提问来源于stack exchange,提问作者rspari
相关产品推荐
相关产品推荐

