Считать csv в список объектов и посылать построчно через mqtt publisher с интервалом 30 секунд. - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно прочитать CSV-файл со списком объектов, чтобы затем выполнить json .dump и отправить построчно с интервалом в 30 секунд. У меня есть такой, но он не работает, он отправляет строку, но он не первый и через 30 секунд по какой-то причине останавливается.

data = []
c = ('id', 'room_id', 'noted_date', 'temp', 'out_in')
with open('online.data.csv', 'r') as file:
    leitor = csv.DictReader(file, fieldnames=c, delimiter=',')
    next(leitor)
    for each in leitor:
        d = {}
        #print (each)
        for field in c:
            d[field] = each[field]
            #print(field)
    data.append(d)
    #print(data)

def signal_handler(sig, frame):
    print ('You pressed Ctrl+C.\nProgram closed.')
    sys.exit(0)

def main(argv):
    signal.signal(signal.SIGINT, signal_handler)

    num_msgs_send = len(data)
    mqttc = mqtt.Client('Publisher')
    mqttc.connect(broker, port)
    msgs_sent = 0
    mqttc.loop_start()
    for i in range(num_msgs_send):
        try:
            payload = json.dumps(data[i])
            print (payload)
            print ('Sending msg: ' + payload)
            mqttc.publish(topic, payload)
            msgs_sent += 1
            time.sleep(30)
        except KeyboardInterrupt:
            sys.exit()
    mqttc.loop_stop()
    print ('Messages sent: ' + str(msgs_sent))

if __name__ == '__main__':
    main(sys.argv[1:])

1 Ответ

1 голос
/ 28 мая 2020

Ваш отступ неверен, вы добавляете только последнюю запись в data, потому что data.append(d) находится за пределами первой for-l oop

with open('online.data.csv', 'r') as file:
    leitor = csv.DictReader(file, fieldnames=c, delimiter=',')
    next(leitor)
    for each in leitor:
        d = {}
        #print (each)
        for field in c:
            d[field] = each[field]
            #print(field)
        data.append(d)
    #print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...