Преобразовать список строк python в bytearray

#python #python-2.7 #type-conversion #concatenation #pyserial

#python #python-2.7 #тип-преобразование #Конкатенация #pyserial

Вопрос:

Я бы написал список на serial COM через pySerial.

Я создаю список строк, где каждая строка является параметром, а затем передаю список в функцию последовательной записи. Возникает ошибка, потому что я не могу записать список строк непосредственно в serial

Это мой код:

 import datetime
import time
import sys
import serial

date = datetime.datetime.now()
dateStr = str(date.strftime('%d-%m-%Y'))
unixTime = int(time.time())
crc = str("1234")


packet = list()

packet.append('test')
packet.append(dateStr)
packet.append(unixTime)
packet.append('4')
packet.append('81')
packet.append('1')
packet.append('0')

packet.append('00.7')
packet.append('4')
packet.append('9')
packet.append('0')

packet.append('18.8')
packet.append('5')
packet.append('3')
packet.append('0')

packet.append('15.3')
packet.append('4')
packet.append('6')
packet.append('0')

packet.append('2')
packet.append('0')
packet.append('13')
packet.append('0')

packet.append('0')
packet.append('0')
packet.append('185.6')

# add semicolon between list elements
serialCOM.write(packet)
 

Есть ли способ объединить все элементы списка в список или bytearray?

Кроме того, мне нужно добавить точку с запятой между каждым элементом списка.

Спасибо за помощь!

Комментарии:

1. вы пробовали ';'.join(packet) ?

2. Кроме того, в списке есть .extend() метод. Вместо того, чтобы писать несколько строк добавлений, просто используйте packet.extend(['4', '81', '1', '0']) .

3. Моя проблема касается элементов списка, которые содержат строку. Например, packet[0], packet [1], packet [2]. Я ищу способ преобразования списка в линейную строку, содержащую список.

Ответ №1:

Если вам нужен фактический объект bytearray, передайте список в конструктор bytearray.

 serialCOM.write(bytearray(packet))
 

Обратите внимание, что unixTime это не преобразуется в строку, поэтому вы должны сначала преобразовать ее.

Но то, что вы, вероятно, хотите (основываясь на комментарии о точках с запятой), — это просто объединить строки, используя метод join для строки, подобной этой:

 # Force all items in the list to be strings
msg = ';'.join(map(str,packet))
serialCOM.write(msg)
 

Результат объединения тогда:

 In[50]: ';'.join(map(str,packet))
Out[50]: 'test;17-10-2016;1476708605;4;81;1;0;00.7;4;9;0;18.8;5;3;0;15.3;4;6;0;2;0;13;0;0;0;185.6'
 

Комментарии:

1. Спасибо frmdstryr ! Это именно то, что я ищу! Еще один вопрос: строка msg должна начинаться с «0x02» и заканчиваться «0x03». Это байты STX и ETX. Буду ли я использовать bytearray для записи непечатаемых символов в serialCom? Могу ли я добавить 0x02 в байтовый массив, преобразовать и объединить сообщение и, наконец, добавить 0x03?

2. Да, вы можете создавать байты, используя ‘ x<hex>’, например. ‘x02’ и ‘ x03’.