Foros del Web » Programando para Internet » Python »

duda: extraer números de un archivo

Estas en el tema de duda: extraer números de un archivo en el foro de Python en Foros del Web. Hola a todos, soy nuevo en forosdelweb y también soy nuevo en python. ¿Alguien me podría ayudar? tengo un archivo xml del que sólo me ...
  #1 (permalink)  
Antiguo 05/06/2009, 05:34
 
Fecha de Ingreso: junio-2009
Mensajes: 11
Antigüedad: 15 años, 5 meses
Puntos: 0
duda: extraer números de un archivo

Hola a todos,
soy nuevo en forosdelweb y también soy nuevo en python.
¿Alguien me podría ayudar?
tengo un archivo xml del que sólo me interesa la información que hay entre dos etiquetas

...
... texto que no me interesa
...
<coordinates>
-9.360033141988373,43.00718071047462,0 -8.79062089455606,41.03053160630184,0 -9.453458585788452,39.40512867696013,0
</coordinates>
...
... texto que no me interesa
...

¿cómo puedo extraer los números y almacenarlos en una tupla?, lo he intentado viendo los módulos re y string pero no me aclaro...
Saludos y gracias
  #2 (permalink)  
Antiguo 05/06/2009, 06:42
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: duda: extraer números de un archivo

Puedes usar el módulo xml para parsear el archivo:
Código python:
Ver original
  1. from xml.dom.minidom import parse
  2. xmlfile = parse("archivo.xml")
  3. elemento = xmlfile.getElementsByTagName("coordinates")[0]
  4. print elemento.childNodes[0].nodeValue
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 05/06/2009, 09:48
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda: extraer números de un archivo

Cita:
Iniciado por David el Grande Ver Mensaje
Puedes usar el módulo xml para parsear el archivo:
Código python:
Ver original
  1. from xml.dom.minidom import parse
  2. xmlfile = parse("archivo.xml")
  3. elemento = xmlfile.getElementsByTagName("coordinates")[0]
  4. print elemento.childNodes[0].nodeValue
Con una mínima modificación se crea la tupla:

Código python:
Ver original
  1. tupla = elemento.childNodes[0].nodeValue.split(" ")

Con expresiones regulares se puede hacer, pero dado que es XML es más sencillo usar un analizador de XML, quizás en algún momento más adelante sí te interese alguna otra parte del archivo.


Saludos.
  #4 (permalink)  
Antiguo 06/06/2009, 04:34
 
Fecha de Ingreso: junio-2009
Mensajes: 11
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: duda: extraer números de un archivo

Muchas gracias alvlin y David el Grande !!!

con vuestras indicaciones y alguna chapuza porque aún me lío con las cadenas listas y tuplas ya tengo mi primera función en Python

Código python:
Ver original
  1. import string
  2. import re
  3.  
  4. def extrae_coordenadas():
  5.     from xml.dom.minidom import parse
  6.    
  7.     KML = raw_input('Archivo KML:')
  8.     xmlfile = parse(KML)
  9.     elemento = xmlfile.getElementsByTagName("coordinates")[0]
  10.     kk = elemento.childNodes[0].nodeValue
  11.     kk = re.sub("\\n","",kk)
  12.     kk = re.sub(",0 ",",",kk)
  13.     lista = kk.split(",")
  14.     i = 0
  15.     L_lon = []   # lista longitudes
  16.     L_lat = []   # lista latitudes
  17.     while i < len(lista):
  18.         if lista[i] <> '':
  19.             L_lon.append(float(lista[i]))
  20.         i = i + 2
  21.     i = 1
  22.     while i < len(lista):
  23.         L_lat.append(float(lista[i]))
  24.         i = i + 2

gracias de nuevo, saludos!

Última edición por AlvaroG; 06/06/2009 a las 12:21
  #5 (permalink)  
Antiguo 06/06/2009, 12:43
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda: extraer números de un archivo

Hola,
He modificado tu mensaje para agregar resaltado de sintaxis :)
Solamente te sugiero algunos cambios al procesar los datos.
Tú tienes tríos (latitud, longitud, tercerParametroQueNoSeQueEs) separados por un espacio.
Sería mejor generar primero una lista separando por espacios, y además usar for en vez de while para recorrerla:

Código python:
Ver original
  1. # eliminar espacios y saltos de línea antes y después
  2. lista = kk.strip(" \n").split(" ")
  3. for trio in lista:
  4.     # cada "trio" es de la forma "numero,numero,numero"
  5.     elementos = trio.split(",")
  6.     L_lon += elementos[0]
  7.     L_lat += elementos[1]

Saludos
  #6 (permalink)  
Antiguo 06/06/2009, 18:25
 
Fecha de Ingreso: junio-2009
Mensajes: 11
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: duda: extraer números de un archivo

Gracias alvlin,
miraré que hace strip y a ver si me aclaro con el for que no es el for que yo conocía muuuuchos años atrás (clipper 87)
el trío es longitud, latitud y altura, solo que la altura no la utilizo para nada, lo que pasa es que el separador es la coma "," no el espacio.

Abusando del foro, podéis decirme por qué me da el siguiente error, y donde encontrar info sobre los códigos de error de python, si pudiera ser en español, mejor...

tengo 2 funciones, que generan un archivo kml (como xml):

Código python:
Ver original
  1. def Abrir_SALIDA():
  2.     SALIDA = open(f_SALIDA, "w")
  3.     SALIDA.write( '<?xml version="1.0" encoding="UTF-8"?>\n')
  4.     SALIDA.write( '<kml xmlns="URLS QUE  ME DAN ERROR AL ENVIAR POR SER USUARIO NUEVO \n')
  5.     SALIDA.write( "<Document>\n")
  6.     SALIDA.write( "  <name>" + f_KML + "</name> \n")
  7.     SALIDA.write( "  <open>1</open> \n")
  8.     SALIDA.write( " <Folder> \n")
  9.     SALIDA.write( "    <name>bordes_mapa</name> \n")
  10.     SALIDA.write( "    <Placemark> \n")
  11.     SALIDA.write( "      <name>" + f_KML + "</name>\n")
  12.     SALIDA.write( "      <LineString>\n")
  13.     SALIDA.write( "        <tessellate>1</tessellate>\n")
  14.     SALIDA.write( "        <coordinates>\n")
  15.     i = 0
  16.     while i < len(L_lat):
  17.         lon = L_lon[i]
  18.         lat = L_lat[i]
  19.         linea = "             " + str(lon) + ',' + str(lat) + ',0\n'
  20.         SALIDA.write(linea)
  21.         i = i + 1
  22.     SALIDA.write( "        </coordinates>\n")
  23.     SALIDA.write( "      </LineString>\n")
  24.     SALIDA.write( "    </Placemark>\n")
  25.     SALIDA.write( "   </Folder> \n")

#-----------------------------------------------------------------------------------
Código python:
Ver original
  1. def Cerrar_SALIDA():
  2.     SALIDA.write( "</Document> \n")
  3.     SALIDA.write( "</kml> \n")
  4.     SALIDA.close()

#-----------------------------------------------------------------------------------

las ejecuto una inmediatamente a continuación de la otra
Abrir_SALIDA()
Cerrar_SALIDA()

Abrir_SALIDA lo ejecuta correctamente y veo que genera el fichero, pero Cerrar_SALIDA me da el siguiente error:

"C:\Python26\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py" , line 312, in RunScript
exec codeObject in __main__.__dict__
File "C:\miquegordis\py\wp_poligono.py", line 274, in <module>
bucle_zoom()
File "C:\miquegordis\py\wp_poligono.py", line 74, in bucle_zoom
Cerrar_SALIDA()
File "C:\miquegordis\py\wp_poligono.py", line 123, in Cerrar_SALIDA
SALIDA.write( "</Document> \n")
AttributeError: 'str' object has no attribute 'write'

Gracias, saludos!!

Última edición por AlvaroG; 07/06/2009 a las 10:55 Razón: resaltado de sintaxis
  #7 (permalink)  
Antiguo 07/06/2009, 10:57
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda: extraer números de un archivo

Cita:
Iniciado por miquegordis Ver Mensaje
miraré que hace strip
http://docs.python.org/library/stdtypes.html#str.strip
Elimina del principio y del final de la cadena los caracteres que le pases como parámetro. En caso de que no reciba parámetros, elimina espacios.
Ejemplo:
Código python:
Ver original
  1. >print '     hola     '.strip()
  2. hola

Cita:
Iniciado por miquegordis Ver Mensaje
y a ver si me aclaro con el for que no es el for que yo conocía muuuuchos años atrás (clipper 87)
http://docs.python.org/tutorial/cont...for-statements
No es necesario remontarse 20 años atrás, la verdad es que cualquier otro lenguaje que conozca tiene el for de la forma "for i=0; i<X;i++". Sin embargo en Python el for itera sobre secuencias, y las secuencias son listas, tuplas, cadenas, y otros tipos que uno mismo puede definir.

Código python:
Ver original
  1. >for letra in "hola":
  2. >    print letra
  3.  
  4. h
  5. o
  6. l
  7. a

Se puede simular el comportamiento de un for "normal" con la función range, que genera una lista de números. Sin embargo es más eficiente utilizar el for "iterador" siempre que sea posible.

Cita:
Iniciado por miquegordis Ver Mensaje
lo que pasa es que el separador es la coma "," no el espacio.
Por tu ejemplo me pareció que los tríos están separados por un espacio, y que cada parte del trío se separa con una coma.

Cita:
Iniciado por miquegordis Ver Mensaje
Abusando del foro, podéis decirme por qué me da el siguiente error
Pues en principio porque SALIDA es una variable local a Abrir_SALIDA, y luego intentas acceder a ella desde otra función. Cerrar_SALIDA no tiene acceso a ella (incluso puedes decir que una vez que Abrir_SALIDA termina su ejecución, SALIDA ya no existe).

La forma correcta sería:

Código python:
Ver original
  1. SALIDA = open(f_SALIDA, "w") # quitando esta línea de la función 'Abrir_SALIDA'
  2. Abrir_SALIDA(SALIDA)
  3. Cerrar_SALIDA(SALIDA)

Si no agregas el parámetro SALIDA a la función creo que todo debería funcionar, pero es mejor evitar las variables globales siempre que sea posible.

He visto que usas el WHILE para generar los tríos de datos, una buena práctica para entender el for de python puede ser intentar reescribir ese while como un for

Por último, recuerda utilizar el resaltado de sintaxis () para que el código se vea mejor, sobretodo en un lenguaje como Python en el que el sangrado importa.


Saludos.
  #8 (permalink)  
Antiguo 07/06/2009, 17:16
 
Fecha de Ingreso: junio-2009
Mensajes: 11
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: duda: extraer números de un archivo

Hola de nuevo alvlin,

bueno, llevo un empacho de Python durante el fin de semana que me ha dejado

Agradezco mucho tus comentarios, me hacen muy fácil lo que me cuesta mucho encontrar en manuales y además mi inglés se queda en happy new year y poco más.

strip: Genial! gracias por el ejemplo!
for: la forma tradicional valor inicial, condición, incremento sí la conocía, y usando range() también lo entiendo, pero lo de las secuencias aún me cuesta... pero llegará.
SALIDA: Genial! lo haré como dices.

Lo del resaltado, entiendo que eso es del editor, ¿no? tengo instalado ActivePython y el editor es PythonWin, y en mi PC lo veo con sangrado y distintos colores, pero al pegar aquí el texto se pierden los colores y el sangrado.

Bien, muchísimas gracias por la ayuda!!!

voy a poner otro post con otra duda distinta y el fin de semana que viene vuelvo a la carga con Python.

Saludos
  #9 (permalink)  
Antiguo 07/06/2009, 20:45
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda: extraer números de un archivo

Cita:
Iniciado por miquegordis Ver Mensaje
Lo del resaltado, entiendo que eso es del editor, ¿no? tengo instalado ActivePython y el editor es PythonWin, y en mi PC lo veo con sangrado y distintos colores, pero al pegar aquí el texto se pierden los colores y el sangrado.
Pues justamente me refería a resaltado de sintaxis aquí en el foro. Como puedes ver he editado tus mensajes para incluir el resaltado. La forma de hacerlo es pegar el texto, seleccionarlo y luego utilizar el botón que te mostré antes (lo encontrarás en la barra de formato del editor mientras escribes tu respuesta, ubicado hacia la derecha)

Saludos
  #10 (permalink)  
Antiguo 08/06/2009, 02:55
 
Fecha de Ingreso: junio-2009
Mensajes: 11
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: duda: extraer números de un archivo

Código Python:
Ver original
  1. def Agradecido(a_quien, mensaje):
  2.     for palabra in mensaje:
  3.         print palabra
  4.     print a_quien
  5.  
  6. # programa principal
  7. mensaje = ['Cierto, se ve mucho mejor.','Muchas gracias']
  8. Agradecido('alvlin',mensaje)


Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:22.