Re: [Python-es] Expresiones regulares
Hola, Supongo que no quieres utilizar json [1], no? [1] https://docs.python.org/2/library/json.html ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
como acabo de recibir el resto de correos que sugieren lo mismo que yo xD te recomiendo otra utilidad http://www.pythonregex.com/ con esa podras evaluar los resultados comodamente, ya que nadie excepto tu puede saber si la expresion es valida al no tener todos los posibles casos que te puedas encontrar. 2014-06-03 11:52 GMT+02:00 Guillermo Vaya nada...@gmail.com: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Hola, Puedes hacer primero un split por la cadena },{ eso te devolverá una lista iterable a la que puede, linea por linea, ir buscando la expresión \ name\:([\z\d]+)\.*\value\\:\([\z\d]+). Quizas debas hacer algunos ajustes, pero creo que te funcionara. Por otra parte, quien te manda los datos, aparentemente es un sistema juicioso que manda los datos en formato JSON, puedes hacer una regex que te valide eso y de paso lo elimine: al principio: {format:JSON,result: y al final: ,version:1.0 el resultado aparente es una cadena con notacion de JSON la cual con la libreria de python la puedes parsear sin problemas y obtener todo lo que necesitas, sin que uses la regex exacta. Saludos y espero te sirva. On Tue, Jun 3, 2014 at 4:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Andres Marin Gomez ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
El 3 de junio de 2014, 11:56, Miguel Angel Rodriguez maro...@gmail.com escribió: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? No es que sea complicado, sólo buscamos cómo trabajar menos, como los buenos informáticos. ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? Lo que veo de la expresión es que buscas name seguido inmediatamente de value, cosa que no ocurre. Prueba a separar los campos con algo así: '''name:(?Pname[\w\d\-. ]+).*?,value:(?Pvalue[\w\d\-. ]*)''' El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R Quarks, bits y otras criaturas infinitesimales: http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Analizar cadena y extraer valores
- Mensaje original - De: Manuel A. Estevez Fernandez stvz...@gmail.com Para: La lista de python en castellano python-es@python.org Enviados: Lunes, 2 de Junio 2014 17:50:02 Asunto: Re: [Python-es] Analizar cadena y extraer valores Muchas gracias por tu aportación Luis, si me pudieras compartir tu código te lo agradecería mucho. Porque de momento estoy jugando todavía a prueba y error con la interpretación del texto extraído. No sé si la lista admite adjuntos. Envío el módulo principal y un ejemplo de uso. Ten en cuenta que este módulo trabaja con el fichero html que se genera con pdftotext a partir del pdf. Yo lo estoy empleando para leer facturas y generar un json con los datos El código de uso sería algo así: from ocr.utilspdf import PdfTextInfo from extra import debug, fechas import json import os.path hInfo = PdfTextInfo(ficheroHtml) self.json = {} j = self.json j['002.pdf.pagDesde'] = 1 j['002.pdf.pagHasta'] = hInfo.totalPaginas j['010.factura'] = hInfo.getTextoEnXY(1, 70.8, 216.352) j['021.fIniFact'] = fechas.YMD(fechas.dd_mm_aa2date(hInfo.getTextoEnXY(1, 70.8, 317.632))) p = hInfo.getNumpag(70.8, 126.416, 'ENDEREZO') j['040.direccion'] = hInfo.getTextoEnRegion(p, (70.8, 134.032, 300, 142.888)) La clase PdfTextInfo está definida en el módulo utilspdf que adjunto. El método getTextoEnXY devuelve la palabra que tiene exactamente esas coordenadas en la esquina superior izquierda. El método getTextoEnRegion recoge el texto que se encuentra en las esquinas que se le pasen. Hay algunos métodos que quizá no te hagan falta, como obtener el total de páginas o preguntar en qué página se encuentra tal texto en tal posición. Si tienes alguna pregunta no tendré problema en contestar: por aquí (si la lista está de acuerdo) o por el correo privado. # -*- coding: ISO-8859-1 -* ''' Created on 07/03/2012 @author: luis ''' import os import codecs from extra import debug import subprocess from HTMLParser import HTMLParser pdfTextInfo = None FORMATO_IDX = %d^%.3f^%.3f # página, coordX, coordY class AnalizadorHtml(HTMLParser): def setPage(self, page): self.page = page def handle_starttag(self, tag, attrs): for attr in attrs: setattr(self, attr[0], attr[1]) def handle_data(self, data): self.word=data.strip() def getInfo(self): return (self.page, float(self.xmin), float(self.ymin), float(self.xmax), float(self.ymax), self.word) def getIdx(self): return FORMATO_IDX % (self.page, float(self.xmin), float(self.ymin)) class PdfTextInfo: def __init__(self, html): self.html = html self.totalPaginas = 0 analizador = AnalizadorHtml() self.palabras = [] self.dict = {}; for lin in codecs.open(html, encoding='utf-8'): lin = lin.strip() if lin.startswith(page ): self.totalPaginas += 1 analizador.setPage(self.totalPaginas) if lin.startswith(word ): analizador.feed(lin) # Añadimos a la lista self.palabras.append(analizador.getInfo()) # Añadimos al diccionario (accede más rápido por coordenadas) self.dict[analizador.getIdx()] = analizador.getInfo() # Ahora ordenamos por pag, yMin, xMin self.palabras.sort(key=lambda w: (w[0], w[2], w[1])) def getNumpag(self, pX, pY, texto): 'Indica en qué página está el texto pasado' for pag in range(1, self.totalPaginas+1): if self.getTextoEnXY(pag, pX, pY) == texto: return pag def getInfoTexto(self, texto): for w in self.palabras: if w[5] == texto: return w def getTextoEnXY(self, pPag, pX, pY): idx = FORMATO_IDX % (pPag, pX, pY) return self.dict[idx][5] if idx in self.dict else None def getTextoEnRegion(self, pPag, pReg): res = for w in self.palabras: (pag, xMin, yMin, xMax, yMax, palabra) = w if pag pPag: return res.strip() if pag == pPag: if xMin = pReg[0] and yMin = pReg[1]: if xMax = pReg[2]+1 and yMax = pReg[3]+1: res += + palabra if yMin pReg[3]: return res.strip() return res.strip() def getCoordenadasDeTexto(self, pPag, texto): for w in self.palabras: (pag, xMin, yMin, xMax, yMax, palabra) = w if pag pPag: return None if pag == pPag and palabra == texto: return xMin, yMin ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Muchisimas gracias por vuestras aportaciones. Al final lo he solucionado un poco a la fuerza bruta. for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\unit\:\[A-Za-z0-9\-. ]+\,\meta\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) ... En cada iteración, en d_value tengo un array de esta forma: [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)]. Solo tengo que acceder a esta array con los indices que me interesen para obtener lo que deseo. Se que no es la forma más optima, pero funciona perfectamente. Muchisimas gracias por todas vuestras aportaciones, sin duda este es el mejor grupo de programadores que existe. Saludos El 3 de junio de 2014, 12:38, Chema Cortes pych...@gmail.com escribió: El 3 de junio de 2014, 11:56, Miguel Angel Rodriguez maro...@gmail.com escribió: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? No es que sea complicado, sólo buscamos cómo trabajar menos, como los buenos informáticos. ¿No creeis que casi está con la expresion regular que indiqué en mi primer correo? Lo que veo de la expresión es que buscas name seguido inmediatamente de value, cosa que no ocurre. Prueba a separar los campos con algo así: '''name:(?Pname[\w\d\-. ]+).*?,value:(?Pvalue[\w\d\-. ]*)''' El 3 de junio de 2014, 11:52, Guillermo Vaya nada...@gmail.com escribió: Si es un json (como indica el ejemplo que pones) ¿por qué no usas alguna de las librerias de json para que lo parsee? A partir de ahi solo tienes que recorrerlo como una estructura de datos y coger aquello que quieras sin los lios inherentes a hacer tus propias expresiones regulares. On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R Quarks, bits y otras criaturas infinitesimales: http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Analizar cadena y extraer valores
Muchas gracias, los voy a revisar. Saludos. by: ISC. Manuel Alejandro Estévez Fernández El 3 de junio de 2014, 5:50, Luis Iglesias luis.igles...@vigo.org escribió: - Mensaje original - De: Manuel A. Estevez Fernandez stvz...@gmail.com Para: La lista de python en castellano python-es@python.org Enviados: Lunes, 2 de Junio 2014 17:50:02 Asunto: Re: [Python-es] Analizar cadena y extraer valores Muchas gracias por tu aportación Luis, si me pudieras compartir tu código te lo agradecería mucho. Porque de momento estoy jugando todavía a prueba y error con la interpretación del texto extraído. No sé si la lista admite adjuntos. Envío el módulo principal y un ejemplo de uso. Ten en cuenta que este módulo trabaja con el fichero html que se genera con pdftotext a partir del pdf. Yo lo estoy empleando para leer facturas y generar un json con los datos El código de uso sería algo así: from ocr.utilspdf import PdfTextInfo from extra import debug, fechas import json import os.path hInfo = PdfTextInfo(ficheroHtml) self.json = {} j = self.json j['002.pdf.pagDesde'] = 1 j['002.pdf.pagHasta'] = hInfo.totalPaginas j['010.factura'] = hInfo.getTextoEnXY(1, 70.8, 216.352) j['021.fIniFact'] = fechas.YMD(fechas.dd_mm_aa2date(hInfo.getTextoEnXY(1, 70.8, 317.632))) p = hInfo.getNumpag(70.8, 126.416, 'ENDEREZO') j['040.direccion'] = hInfo.getTextoEnRegion(p, (70.8, 134.032, 300, 142.888)) La clase PdfTextInfo está definida en el módulo utilspdf que adjunto. El método getTextoEnXY devuelve la palabra que tiene exactamente esas coordenadas en la esquina superior izquierda. El método getTextoEnRegion recoge el texto que se encuentra en las esquinas que se le pasen. Hay algunos métodos que quizá no te hagan falta, como obtener el total de páginas o preguntar en qué página se encuentra tal texto en tal posición. Si tienes alguna pregunta no tendré problema en contestar: por aquí (si la lista está de acuerdo) o por el correo privado. ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Analizar cadena y extraer valores
pdfminner El día 3 de junio de 2014, 12:07, Manuel A. Estevez Fernandez stvz...@gmail.com escribió: Muchas gracias, los voy a revisar. Saludos. by: ISC. Manuel Alejandro Estévez Fernández El 3 de junio de 2014, 5:50, Luis Iglesias luis.igles...@vigo.org escribió: - Mensaje original - De: Manuel A. Estevez Fernandez stvz...@gmail.com Para: La lista de python en castellano python-es@python.org Enviados: Lunes, 2 de Junio 2014 17:50:02 Asunto: Re: [Python-es] Analizar cadena y extraer valores Muchas gracias por tu aportación Luis, si me pudieras compartir tu código te lo agradecería mucho. Porque de momento estoy jugando todavía a prueba y error con la interpretación del texto extraído. No sé si la lista admite adjuntos. Envío el módulo principal y un ejemplo de uso. Ten en cuenta que este módulo trabaja con el fichero html que se genera con pdftotext a partir del pdf. Yo lo estoy empleando para leer facturas y generar un json con los datos El código de uso sería algo así: from ocr.utilspdf import PdfTextInfo from extra import debug, fechas import json import os.path hInfo = PdfTextInfo(ficheroHtml) self.json = {} j = self.json j['002.pdf.pagDesde'] = 1 j['002.pdf.pagHasta'] = hInfo.totalPaginas j['010.factura'] = hInfo.getTextoEnXY(1, 70.8, 216.352) j['021.fIniFact'] = fechas.YMD(fechas.dd_mm_aa2date(hInfo.getTextoEnXY(1, 70.8, 317.632))) p = hInfo.getNumpag(70.8, 126.416, 'ENDEREZO') j['040.direccion'] = hInfo.getTextoEnRegion(p, (70.8, 134.032, 300, 142.888)) La clase PdfTextInfo está definida en el módulo utilspdf que adjunto. El método getTextoEnXY devuelve la palabra que tiene exactamente esas coordenadas en la esquina superior izquierda. El método getTextoEnRegion recoge el texto que se encuentra en las esquinas que se le pasen. Hay algunos métodos que quizá no te hagan falta, como obtener el total de páginas o preguntar en qué página se encuentra tal texto en tal posición. Si tienes alguna pregunta no tendré problema en contestar: por aquí (si la lista está de acuerdo) o por el correo privado. ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Juan B Cabral ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation name:Cntry;value:--- name:Type;value:1.000 name:Type;value:935 name:Type;value:217.5 name:Type;value:513.8 name:Type;value:335.2 name:Type;value:-1.0 name:Type;value:335.1 name:Type;value:49.950 te vale? Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Hola, ¿Es siempre un json lo que recibes? Lo digo porque quizás puedes intentar decodificarlo como json ¿no? https://docs.python.org/2/library/json.html He comprobado la sintaxis de la cadena que pasas y es un formato válido de json: { format:JSON, result:{ devices:[ { key:SCGDE1BA:180340320, channels:[ { name:PF, unit:, meta:PF, value:1.000 }, { name:P-WSpt, unit:kW, meta:P-WSpt, value:935 }, { name:Vac, unit:V, meta:Vac, value:217.5 }, { name:Iac, unit:A, meta:Iac, value:513.8 }, { name:Pac, unit:kW, meta:Pac, value:335.2 }, { name:Qac, unit:kV Ar, meta:Qac, value:-1.0 }, { name:Sac, unit:kVA, meta:Sac, value:335.1 }, { name:Fac, unit:Hz, meta:Fac, value:49.950 }, { name:ErrNoFirst, unit:, meta:ErrNoFirst, value:0 }, { name:P-WModFailStt, unit:, meta:P-WModFailStt, value:Off }, { name:P-WModStt, unit:, meta:P-WModStt, value:Off }, { name:Dsc, unit:, meta:Dsc, value:--- }, { name:Firmware-9, unit:, meta:Firmware-9, value: }, { name:Cntry, unit:, meta:Cntry, value:DE1 }, { name:Type, unit:, meta:Type, value:SCG }, { name:Mode, unit:, meta:Mode, value:Operation }, { name:Error, unit:, meta:Error, value:--- } ] } ] }, version:1.0 } A no ser que en otras ocasiones recibas otra cosas, lo que yo te recomendaría es que lo decodifiques y lo uses cono clave, valor. Espero que te ayude, un saludo! Un saludo -- *José Miguel Pérez Álvarez*, @jozemi http://twitter.com/jozemi Linkedin: http://es.linkedin.com/in/jozemi joz...@gmail.com On Tue, Jun 3, 2014 at 11:22 AM, Miguel Angel Rodriguez maro...@gmail.com wrote: Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Voto por lo correcto que sería así: import os import json import codecs text = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320, etc . . . path = /tmp/x.json archivo = open(path, w) archivo.write(text) archivo.close() archivo = codecs.open(path, r, utf-8) diccionario = json.JSONDecoder(utf-8).decode(archivo.read()) El 3 de junio de 2014, 8:03, gust...@nodo50.org escribió: ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation name:Cntry;value:--- name:Type;value:1.000 name:Type;value:935 name:Type;value:217.5 name:Type;value:513.8 name:Type;value:335.2 name:Type;value:-1.0 name:Type;value:335.1 name:Type;value:49.950 te vale? Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
No entiendo que haces con archivo... Nunca he programado con json en python. ¿Como seria a partir de lo que indicas el parseo de los datos? Es decir, ¿Como seria el bucle que me iria dando el name y el value? 2014-06-03 22:08 GMT+02:00 Flavio Danesse fdane...@gmail.com: Voto por lo correcto que sería así: import os import json import codecs text = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320, etc . . . path = /tmp/x.json archivo = open(path, w) archivo.write(text) archivo.close() archivo = codecs.open(path, r, utf-8) diccionario = json.JSONDecoder(utf-8).decode(archivo.read()) El 3 de junio de 2014, 8:03, gust...@nodo50.org escribió: ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation name:Cntry;value:--- name:Type;value:1.000 name:Type;value:935 name:Type;value:217.5 name:Type;value:513.8 name:Type;value:335.2 name:Type;value:-1.0 name:Type;value:335.1 name:Type;value:49.950 te vale? Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Expresiones regulares
Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está salvado, que era pasar el string a un diccionario donde tienes parejas key-value. El segundo obstaculo es hacer recursividad dentro del diccionario para seguir hacia adentro de la estructura obteniendo los diccionarios internos. No es tan complicado, puedes comenzar con algo como: for key in diccionario.keys(): valor = diccionario[key] . . . lo que quieras con el key y lo que quieras con value aca importa que tipo de dato es el value, porque por lo que veo tienes listas, diccionarios, string, etc, utiliza type(valor) para operar sobre ellos según su tipo. El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez maro...@gmail.com escribió: No entiendo que haces con archivo... Nunca he programado con json en python. ¿Como seria a partir de lo que indicas el parseo de los datos? Es decir, ¿Como seria el bucle que me iria dando el name y el value? 2014-06-03 22:08 GMT+02:00 Flavio Danesse fdane...@gmail.com: Voto por lo correcto que sería así: import os import json import codecs text = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320, etc . . . path = /tmp/x.json archivo = open(path, w) archivo.write(text) archivo.close() archivo = codecs.open(path, r, utf-8) diccionario = json.JSONDecoder(utf-8).decode(archivo.read()) El 3 de junio de 2014, 8:03, gust...@nodo50.org escribió: ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation name:Cntry;value:--- name:Type;value:1.000 name:Type;value:935 name:Type;value:217.5 name:Type;value:513.8 name:Type;value:335.2 name:Type;value:-1.0 name:Type;value:335.1 name:Type;value:49.950 te vale? Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel Rodríguez de Alba 678304435 maro...@gmail.com ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ:
Re: [Python-es] Expresiones regulares
Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está salvado, que era pasar el string a un diccionario donde tienes parejas key-value. El segundo obstaculo es hacer recursividad dentro del diccionario para seguir hacia adentro de la estructura obteniendo los diccionarios internos. No es tan complicado, puedes comenzar con algo como: for key in diccionario.keys(): valor = diccionario[key] . . . lo que quieras con el key y lo que quieras con value aca importa que tipo de dato es el value, porque por lo que veo tienes listas, diccionarios, string, etc, utiliza type(valor) para operar sobre ellos según su tipo. El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez maro...@gmail.com escribió: No entiendo que haces con archivo... Nunca he programado con json en python. ¿Como seria a partir de lo que indicas el parseo de los datos? Es decir, ¿Como seria el bucle que me iria dando el name y el value? 2014-06-03 22:08 GMT+02:00 Flavio Danesse fdane...@gmail.com: Voto por lo correcto que sería así: import os import json import codecs text = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320, etc . . . path = /tmp/x.json archivo = open(path, w) archivo.write(text) archivo.close() archivo = codecs.open(path, r, utf-8) diccionario = json.JSONDecoder(utf-8).decode(archivo.read()) El 3 de junio de 2014, 8:03, gust...@nodo50.org escribió: ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation name:Cntry;value:--- name:Type;value:1.000 name:Type;value:935 name:Type;value:217.5 name:Type;value:513.8 name:Type;value:335.2 name:Type;value:-1.0 name:Type;value:335.1 name:Type;value:49.950 te vale? Hola a todos, Estoy intentando parsear con Python una gran cadena que recibo en un software de comunicaciones que estoy programando. La cadena que yo recibo es la siguiente: value_str = {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Yo solo quiero quedarme con los name y value existente. LA forma en la que lo estoy intentando es la siguiente: for channel_str in re.findall(\name\:\[A-Za-z0-9\-. ]+\,\value\:\[A-Za-z0-9\-. ]*\,value_str): d_value = re.findall([A-Za-z0-9.\-]+,channel_str) Pero de esta forma no entra en el for. ¿Alguien me puede ayudar? Gracias y un saludo -- Miguel Ángel
Re: [Python-es] Expresiones regulares
Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA: 180340320,channels:[{name:PF,unit:,meta:PF, value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{ name:Iac,unit:A,meta:Iac,value:513.8},{ name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA ,meta:Sac,value:335.1},{name:Fac,unit:Hz, meta:Fac,value:49.950},{name:ErrNoFirst,unit: ,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit: ,meta:P-WModFailStt,value:Off},{name:P- WModStt,unit:,meta:P-WModStt,value:Off},{ name:Dsc,unit:,meta:Dsc,value:---},{name: Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{ name:Mode,unit:,meta:Mode,value:Operation},{ name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que no consigo El 3 de junio de 2014, 22:40, Flavio Danesse fdane...@gmail.com escribió: Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está salvado, que era pasar el string a un diccionario donde tienes parejas key-value. El segundo obstaculo es hacer recursividad dentro del diccionario para seguir hacia adentro de la estructura obteniendo los diccionarios internos. No es tan complicado, puedes comenzar con algo como: for key in diccionario.keys(): valor = diccionario[key] . . . lo que quieras con el key y lo que quieras con value aca importa que tipo de dato es el value, porque por lo que veo tienes listas, diccionarios, string, etc, utiliza type(valor) para operar sobre ellos según su tipo. El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez maro...@gmail.com escribió: No entiendo que haces con archivo... Nunca he programado con json en python. ¿Como seria a partir de lo que indicas el parseo de los datos? Es decir, ¿Como seria el bucle que me iria dando el name y el value? 2014-06-03 22:08 GMT+02:00 Flavio Danesse fdane...@gmail.com: Voto por lo correcto que sería así: import os import json import codecs text = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320, etc . . . path = /tmp/x.json archivo = open(path, w) archivo.write(text) archivo.close() archivo = codecs.open(path, r, utf-8) diccionario = json.JSONDecoder(utf-8).decode(archivo.read()) El 3 de junio de 2014, 8:03, gust...@nodo50.org escribió: ejecutando esto: #!/usr/bin/python3 import re value_str = '{format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935},{name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kVAr,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value:},{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0' for channel_str in re.findall(\name\:\[A-Za-z0-9\-.]+\,value_str): for channel_str1 in re.findall(\value\:\[A-Za-z0-9\-.]+\,value_str): print ( channel_str + ; + channel_str1 ) me da esto: name:Cntry;value:335.2 name:Cntry;value:-1.0 name:Cntry;value:335.1 name:Cntry;value:49.950 name:Cntry;value:0 name:Cntry;value:Off name:Cntry;value:Off name:Cntry;value:--- name:Cntry;value:DE1 name:Cntry;value:SCG name:Cntry;value:Operation
Re: [Python-es] Expresiones regulares
Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA: 180340320,channels:[{name:PF,unit:,meta:PF, value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{ name:Iac,unit:A,meta:Iac,value:513.8},{ name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA ,meta:Sac,value:335.1},{name:Fac,unit:Hz, meta:Fac,value:49.950},{name:ErrNoFirst,unit: ,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit: ,meta:P-WModFailStt,value:Off},{name:P- WModStt,unit:,meta:P-WModStt,value:Off},{ name:Dsc,unit:,meta:Dsc,value:---},{name: Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{ name:Mode,unit:,meta:Mode,value:Operation},{ name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que no consigo El 3 de junio de 2014, 22:40, Flavio Danesse fdane...@gmail.com escribió: Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está salvado, que era pasar el string a un diccionario donde tienes parejas key-value. El segundo obstaculo es hacer recursividad dentro del diccionario para seguir hacia adentro de la estructura obteniendo los diccionarios internos. No es tan complicado, puedes comenzar con algo como: for key in diccionario.keys(): valor = diccionario[key] . . . lo que quieras con el key y lo que quieras con value aca importa que tipo de dato es el value, porque por lo que veo tienes listas, diccionarios, string, etc, utiliza type(valor) para operar sobre ellos según su tipo. El 3 de junio de 2014, 17:13, Miguel Angel Rodriguez maro...@gmail.com escribió: No entiendo que haces con
Re: [Python-es] Expresiones regulares
ok, dame unos minutos, me pongo en esto y te aviso. El 3 de junio de 2014, 17:55, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA: 180340320,channels:[{name:PF,unit:,meta:PF, value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{ name:Iac,unit:A,meta:Iac,value:513.8},{ name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA ,meta:Sac,value:335.1},{name:Fac,unit:Hz, meta:Fac,value:49.950},{name:ErrNoFirst,unit: ,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit: ,meta:P-WModFailStt,value:Off},{name:P- WModStt,unit:,meta:P-WModStt,value:Off},{ name:Dsc,unit:,meta:Dsc,value:---},{name: Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{ name:Mode,unit:,meta:Mode,value:Operation},{ name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que no consigo El 3 de junio de 2014, 22:40, Flavio Danesse fdane...@gmail.com escribió: Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está salvado, que era pasar el string a un diccionario donde tienes parejas key-value. El segundo obstaculo es hacer recursividad dentro del diccionario para seguir hacia adentro de la estructura obteniendo los diccionarios internos. No es tan complicado, puedes comenzar con algo como: for key in diccionario.keys(): valor = diccionario[key] . . . lo que quieras con el key y lo que quieras con value aca importa que tipo de dato es el value, porque por lo que veo tienes listas, diccionarios, string, etc, utiliza
Re: [Python-es] Expresiones regulares
Hola, por lo que veo el json esta mal formado (o le falta una parte a la cadena), para poder parsearlo hay que eliminar la parte sobrante: import json # remover la parte sobrante json_string = json_string = string.replace(',version:1.0 ', '}') data = json.loads(json_string) # si la cadena tiene la misma estructura siempre puedes hacer esto channels = data[result][devices][0][channels] key_value = map(lambda a: a.items(), channels) con esto tienes una lista de listas con el formato [('value', valor_value), ('meta', valor_meta), ('name', valor_name), ('unit', valor_unit)] El 3 de junio de 2014, 15:55, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA: 180340320,channels:[{name:PF,unit:,meta:PF, value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{ name:Iac,unit:A,meta:Iac,value:513.8},{ name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA ,meta:Sac,value:335.1},{name:Fac,unit:Hz, meta:Fac,value:49.950},{name:ErrNoFirst,unit: ,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit: ,meta:P-WModFailStt,value:Off},{name:P- WModStt,unit:,meta:P-WModStt,value:Off},{ name:Dsc,unit:,meta:Dsc,value:---},{name: Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{ name:Mode,unit:,meta:Mode,value:Operation},{ name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que no consigo El 3 de junio de 2014, 22:40, Flavio Danesse fdane...@gmail.com escribió: Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo cual te da la pareja key:value. En todos los casos obtendrás lista de keys, values o items. Ahora bien, el primer obstáculo está
Re: [Python-es] Expresiones regulares
Solucionado, dejo adjunto. El 3 de junio de 2014, 19:56, Jhonatan Sneider Salguero Villa sney2...@gmail.com escribió: Hola, por lo que veo el json esta mal formado (o le falta una parte a la cadena), para poder parsearlo hay que eliminar la parte sobrante: import json # remover la parte sobrante json_string = json_string = string.replace(',version:1.0 ', '}') data = json.loads(json_string) # si la cadena tiene la misma estructura siempre puedes hacer esto channels = data[result][devices][0][channels] key_value = map(lambda a: a.items(), channels) con esto tienes una lista de listas con el formato [('value', valor_value), ('meta', valor_meta), ('name', valor_name), ('unit', valor_unit)] El 3 de junio de 2014, 15:55, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA:180340320,channels:[{name:PF,unit:,meta:PF,value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{name:Iac,unit:A,meta:Iac,value:513.8},{name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA,meta:Sac,value:335.1},{name:Fac,unit:Hz,meta:Fac,value:49.950},{name:ErrNoFirst,unit:,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt,value:Off},{name:P-WModStt,unit:,meta:P-WModStt,value:Off},{name:Dsc,unit:,meta:Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{name:Mode,unit:,meta:Mode,value:Operation},{name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que obtengo un array de solo 7 elementos (sin el elemento valor del unit) y consigo recuperar el value para ese name. ¿Alguien me podría ayudar con esto? Por ultimo, con la solucion con JSON, ¿es necesario usar ficheros? No se como será el manejo de ficheros en el sistema donde va a funcionar este python. Gracias y un saludo El 3 de junio de 2014, 22:53, Miguel Angel Rodriguez maro...@gmail.com escribió: Este es un ejemplo de lo que recibo: {format:JSON,result:{devices:[{key:SCGDE1BA: 180340320,channels:[{name:PF,unit:,meta:PF, value:1.000},{name:P-WSpt,unit:kW,meta:P-WSpt,value:935}, {name:Vac,unit:V,meta:Vac,value:217.5},{ name:Iac,unit:A,meta:Iac,value:513.8},{ name:Pac,unit:kW,meta:Pac,value:335.2},{name:Qac,unit:kV Ar,meta:Qac,value:-1.0},{name:Sac,unit:kVA ,meta:Sac,value:335.1},{name:Fac,unit:Hz, meta:Fac,value:49.950},{name:ErrNoFirst,unit: ,meta:ErrNoFirst,value:0},{ name:P-WModFailStt,unit:,meta:P-WModFailStt, value:Off},{name:P-WModStt,unit:,meta:P- WModStt,value:Off},{name:Dsc,unit:,meta: Dsc,value:---},{name:Firmware-9,unit:,meta:Firmware-9,value: },{name:Cntry,unit:,meta:Cntry,value:DE1} ,{name:Type,unit:,meta:Type,value:SCG},{ name:Mode,unit:,meta:Mode,value:Operation},{ name:Error,unit:,meta:Error,value:---}]}]},version:1.0 Quiero parsearlo para poder almacenar en unas variables que tengo los values que aparecen en el JSON. De esta forma: Con la solucion con expresiones regulares en cada iteracion tengo lo siguiente: d_value = [name,(valor del name),unit,(valor del unit),meta,(valor del meta),value,(valor del value)] En esa iteracion hago lo siguiente: if d_value[1] == PF: mi_variable_PF = d_value[7] if d_value[1] == Fac: mi_variable_Fac = d_value[7] . No necesito todos los values, solo los que corresponden a unos determinados name. Con la solucion con expresiones regulares tengo el siguiente bug: Alguna veces en el json aparece unit:. Es decir, la clave key no tiene valor, por lo que no consigo El 3 de junio de 2014, 22:40, Flavio Danesse fdane...@gmail.com escribió: Si quieres pasame un string de ejemplo que esté completo y dime que hacer con los values y te escribo la solución. El 3 de junio de 2014, 17:38, Flavio Danesse fdane...@gmail.com escribió: Lo que hago es tomar el string que tienes y guardarlo en un archivo como texto plano pero luego lo cargo utilizando json con lo cual obtengo un diccionario python. Para obtener las keys y values del diccionario solo tienes que hacer diccionario.keys() y diccionario.values() o puedes hacer también diccionario.items() lo
Re: [Python-es] Expresiones regulares
2014-06-03 4:56 GMT-05:00 Miguel Angel Rodriguez maro...@gmail.com: En principio necesito hacerlo con expresiones regulares. ¿Lo veis muy complicado? Se puede saber por qué? 2014-06-03 15:13 GMT-05:00 Miguel Angel Rodriguez maro...@gmail.com: Nunca he programado con json en python. No hay mejor razón para comenzar ahora ;) Saludos -- A menudo unas pocas horas de Prueba y error podrán ahorrarte minutos de leer manuales. ___ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/