2013-02-26 7 views
1

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

Я использую следующий код для чтения из последовательного устройства, опрашивает моя система дома HVAC (большинство из этого плохо скопировали с постов чужих здесь):

import time 
import serial 
import StringIO 

# configure the serial connections 
ser = serial.Serial(
     port='/dev/ttyS0', 
     baudrate=9600, 
     parity=serial.PARITY_NONE, 
     stopbits=serial.STOPBITS_ONE, 
     bytesize=serial.EIGHTBITS 
) 

input=1 
while 1 : 
     # Use static command to debug 
     input = "stats" 
     # Python 3 users 
     # input = input(">> ") 
     if input == 'exit': 
       ser.close() 
       exit() 
     else: 
       # send the character to the device 
       # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device) 
       ser.write(input + '\r\n') 
       outputFCUData = '' 
       # let's wait one second before reading output (let's give device time to answer) 
       time.sleep(1) 
       while ser.inWaiting() > 0: 
         outputFCUData += ser.read(1) 

       if outputFCUData != '': 
         fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines() 
         fcuArrayTemp.pop(0) 
         fcuArrayTemp.pop(-1) 
         fcuArrayTemp.pop(-1) 
         fcuArrayTemp.pop(-1) 
         print fcuArrayTemp 
         exit() 

Если бы я опрашивать устройство без какого-либо форматирования, то результат будет:

stats 
101 ON 070F 070F Low Heat OK 0 
102 ON 069F 069F Low Heat OK 0 
103 ON 069F 069F Low Heat OK 0 
104 ON 069F 070F Low Heat OK 0 
105 OFF 072F 064F High Heat U5 0 
OK 
> 
> 

Который, когда я pop(0) и pop(-1) «s в коде, чтобы удалить все, кроме 5 строк информации, которую я хочу. Любопытно, что первый столбец (например, «101») - это имена моего fancoil, за которым следуют статус, заданное значение, текущая температура, скорость вентилятора, режим (тепло/холод), коды ошибок (например, 105 не имеет t -stat, поэтому он имеет U5 error), а затем последний столбец - это любые ошибки, отправляемые командами устройству - теперь нет, следовательно, «0».

Так что я хочу взять этот вывод и преобразовать его в массив, чтобы я мог, например, вызвать команду fcuStatus[i][j], чтобы вытащить информацию из ячейки (i, j).

Что я получаю от моего кода заключается в следующем:

['101 ON 070F 070F Low Heat OK 0', '102 ON 069F 069F Low Heat OK 0', '103 ON 069F 069F Low Heat OK 0', '104 ON 069F 070F Low Heat OK 0', '105 OFF 072F 064F High Heat U5 0'] 

Какой 1 строка, 5 столбец списка. Я считаю, что мне нужно просто прочитать элементы из этого списка и добавить их в массив. Так что я добавить код:

for element in fcuArrayTemp 
    parts = element.split(' ') 
    print parts 

Так что теперь мой результат:

['101', 'ON', '', '070F', '070F', '', 'Low', '', 'Heat', 'OK', '0'] 
['102', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0'] 
['103', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0'] 
['104', 'ON', '', '069F', '069F', '', 'Low', '', 'Heat', 'OK', '0'] 
['105', 'OFF', '072F', '064F', '', 'High', '', 'Heat', 'U5', '0'] 

Что довольно близко к тому, что я хочу, за исключением того, есть некоторые дополнительные столбцы, добавленные в результате меня разделив на одиночный пробел, когда имеется двойной пробел.

Мой код неряшлив, и я должен верить, что есть лучший способ. Может ли кто-нибудь показать мне, как взять строковую информацию, которую я получаю в своей переменной outputFCUData, и преобразовать ее в функциональный массив без дополнительных пробелов? Всегда будет 8 столбцов, но по мере добавления фэнкойлов в систему массив может расширяться до 128 + строк. Любое из вышеизложенного состоит в том, что я не знаю лучше, не потому, что я пытаюсь соответствовать определенному набору руководств - любые предложения более чем приветствуются.

Edit- Wow-Radio - получил меня именно то, что мне было нужно - спасибо!

for element in fcuArrayTemp 
    parts = element.split() 
    print parts 

Так что, действительно, последняя часть этого - это то, как я затем беру эти организованные списки и создаю матрицу столбцов N на 8 столбцов? Это приводит к ошибкам при отсутствии аргументов для добавления. Добавление «элемента» к добавляемому элементу (fcuArray.append (element)) не приводит меня туда.

fcuArray = [] 
for element in parts: 
    fcuArray = fcuArray.append() 
    print fcuArray 

Еще раз спасибо

EDIT: Найдено решение, которое работает для мне- размещения его здесь для кого, что ищет что-то подобное.Хитрость в том, чтобы добавить каждую строку из списков на мой массив, как они были получены:

fcuArray = [] 
for element in fcuArrayTemp 
    parts = element.split() 
    fcuArray.append(parts) 

Теперь я могу сообщить любое значение в массиве, запрашивая строку и позицию. Например, чтобы сообщить имя третьего fancoil в моем массиве, я попрошу fcuArray [3] [0] (а именно «print fcuArray [3] [0]», который вернет «104».

мой полный код:

import time 
import serial 
import StringIO 
import pprint 

# configure the serial connections 
ser = serial.Serial(
     port='/dev/ttyS0', 
     baudrate=9600, 
     parity=serial.PARITY_NONE, 
     stopbits=serial.STOPBITS_ONE, 
     bytesize=serial.EIGHTBITS 
) 

input=1 
while 1 : 
     # Use static command to debug 
     input = "stats" 
     # Python 3 users 
     # input = input(">> ") 
     if input == 'exit': 
       ser.close() 
       exit() 
     else: 
       # send the character to the device 
       # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device) 
       ser.write(input + '\r\n') 
       outputFCUData = '' 
       # let's wait one second before reading output (let's give device time to answer) 
       time.sleep(1) 
       while ser.inWaiting() > 0: 
         outputFCUData += ser.read(1) 

       if outputFCUData != '': 
         fcuArrayTemp = StringIO.StringIO(outputFCUData).read().splitlines() 
         fcuArrayTemp.pop(0) 
         fcuArrayTemp.pop(-1) 
         fcuArrayTemp.pop(-1) 
         fcuArrayTemp.pop(-1) 
       fcuArray = [] 
       for element in fcuArrayTemp: 
          parts = element.split() 
       fcuArray.append(parts) 
       print fcuArray 
       print fcuArray[3][0] 
       exit() 

ответ

1

Изменение element.split(' ') к element.split() будет достаточно, чтобы удалить лишние столбцы

>>> for element in fcuArrayTemp: 
...  print element.split() 
... 
['101', 'ON', '070F', '070F', 'Low', 'Heat', 'OK', '0'] 
['102', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0'] 
['103', 'ON', '069F', '069F', 'Low', 'Heat', 'OK', '0'] 
['104', 'ON', '069F', '070F', 'Low', 'Heat', 'OK', '0'] 
['105', 'OFF', '072F', '064F', 'High', 'Heat', 'U5', '0'] 
.
Смежные вопросы