2012-06-03 2 views
1

После нескольких операций, я получить список шаблона:Поиск кортежи для частичной строки Спички использования результатов XML PARSING

[(u'DAY1 KWH', u'300.000000'), 
(u'DAY2 KWH', u'300.000000'), 
(u'DAY3 KWH', u'300.000000'), 
(u'DAY4 KWH', u'300.000000'), 
(u'DAY5 KWH', u'300.000000'), 
(u'DAY6 KWH', u'300.000000'), 
(u'DAY7 KWH', u'300.000000'), 
(u'DAY8 KWH', u'300.000000'), 
(u'DAY9 KWH', u'300.000000'), 
(u'DAY10 KWH', u'300.000000'), 
(u'DAY11 KWH', u'300.000000'), 
(u'DAY12 KWH', u'300.000000'), 
(u'DAY13 KWH', u'300.000000'), 
(u'DAY14 KWH', u'300.000000'), 
... 

Не все элементы содержат слово «день» или «KWH» - в факт, что они могут быть измерениями использования природного газа в течение месяца или использования воды в течение недели и т. д. Я бы хотел извлечь все значения «день» и поместить их в один список, всю неделю, значения и поместить их в другой список, а все значения «месяц» - в третий список. Конечная цель состоит в том, чтобы иметь возможность отображать ежедневное, еженедельное и ежемесячное использование полезности. Имейте в виду, что это тестовые значения.

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

Я знаю, что код можно было бы сделать более эффективным/быстрым, поэтому, если у вас есть предложения по оптимизации, не стесняйтесь добавлять их также. Ваша помощь очень ценится!

import urllib 
import urllib2 
from xml.dom import minidom 
import matplotlib.pyplot as plt 

def main(): 

    path = "http://128.226.6.214/bacrest/bacnet_device_70200/" 
    BACrest = 'urn:BACrestService' 
    xlink = 'http://www.w3.org/1999/xlink' 

    dom = minidom.parse(urllib.urlopen(path)) 

    values = [] 
    descriptions = [] 
    for node in dom.getElementsByTagNameNS(BACrest, 'ChildNode'): 

     href = node.getAttributeNS(xlink, 'href') 

     descriptionDomain = href + '/Description' 
     descriptionSubDom = minidom.parse(urllib.urlopen(descriptionDomain)) 
     descriptionElements = descriptionSubDom.getElementsByTagNameNS(BACrest, 'return') 
     descriptions.append(descriptionElements) 

     valueDomain = href + '/Value' 
     valueSubDom = minidom.parse(urllib.urlopen(valueDomain)) 
     valueElements = valueSubDom.getElementsByTagNameNS(BACrest, 'return')[0].firstChild.data 
     values.append(valueElements) 

    combination = zip(descriptions,values) 

Решение Попытки

#print filter(lambda x: 'DAY1 ' in x, combination) 

    #dayInfo = [] 
    #for sublist in combination: 
     #if 'DAY1 ' in sublist: 
      #dayInfo.append(sublist) 
    #print dayInfo 

    #dayInfo = [s for s in combination if 'DAY1 ' in s] 
    #print dayInfo 

    #dayInfo = [i for i,v in combination if i.startswith('DAY1') in i] 
    #print dayInfo 

    #dayInfo = [] 
    #if any('DAY1 ' in x for x in combination): 
     #dayInfo.append(x) 
    #print dayInfo 

main() 

ответ

0

Если data некоторый список вида [(u'DAY1 KWH', u'300.000000'), (u'DAY2 KWH', u'300.000000'), ...], как вы описали, то следующий код должен работать:

for desc, val in data: 
    if 'DAY' in desc: 
     # do something with val 
    elif 'WEEK' in desc: 
     # do something else with val 
    # etc... 

Обратите внимание, что это ISN особенно устойчив, поскольку он потерпел неудачу из-за расхождений в, например, капитализации. С помощью сопоставления регулярных выражений или переполнения desc на каждой итерации перед выполнением поиска строк, вероятно, будет значительно превосходить, если вы не можете быть абсолютно уверены, что вход всегда будет заглавным.

+0

Awesome! Ниже, если я использовал dayInfo.append ([desc, val]), и он работал как шарм –