Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] KML Converter

Estas en el tema de KML Converter en el foro de Python en Foros del Web. Buenas tardes, Tengo un problema de funcionamiento en uno de mis programas escrito en Python. El objetivo del programa es leer de un fichero KML ...
  #1 (permalink)  
Antiguo 12/04/2013, 08:53
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 10 meses
Puntos: 0
Exclamación KML Converter

Buenas tardes,
Tengo un problema de funcionamiento en uno de mis programas escrito en Python. El objetivo del programa es leer de un fichero KML (o varios si se diese el caso), los datos contenidos en una etiqueta en concreto llamada 'coordinates' y crear un .txt. Tengo creados varios métodos para la lectura y procesamiento de los datos para su correcto uso posterior.

El código funciona correctamente cuando en el .kml sólo hay una etiqueta coordinates, pero se supone que debería ser capaz de leer varias. Al hacer una prueba con un archivo de 16.000 líneas de código .kml el programa se ha colgado directamente. A ver si me podéis ayudar.

El programa consta con una estructura de carpetas a saber:
- New_Files: Aquí se hallan los archivos que el usuario desea convertir.
- Treated_Files: Aquí están los archivos ya usados.
- TXT_Files: Aquí está el archivo generado con el programa. El programa por defecto escribe a continuación de este archivo, si el archivo no existiese se crea.


Código:
'''
KML to TXT Converter (KtTC)
Copyright all rights reserved 
Ignacio Fontán Matilla
4-April-2013
'''


#### IMPORTS ####
from xml.dom import minidom
import os
import shutil
import tempfile
#### FIN IMPORTS ####


#### FUNCIONES ####

def buscaXMLTag(xmlFile,xmlTag):
        '''
        Función que busca una etiqueta xml
        dentro de la ruta especificada.
        
        buscaXMLTag(Ruta hasta el xml,etiqueta buscada)
        '''
        resultList = []
        try:
                dom = minidom.parse(xmlFile)
                elements = dom.getElementsByTagName(xmlTag)
                if len(elements) != 0:
                        for i in range(0,len(elements)):
                                resultList.append([elements[i].childNodes[0].nodeValue])
                else:
                        print 'No existen elementos en el fichero XML con la etiqueta '+ xmlTag
        except:
                print 'El fichero no existe o está mal formado.'
                print 'Path del fichero: ' + xmlFile
                print 'Etiqueta sobre la que se realizó la búsqueda: '+ xmlTag

        return resultList

def preparaDatos(d):
        '''
        Función que prepara los datos eliminando
        caracteres indeseados y convirtiendo la
        cadena en una lista de pares de elementos.
        
        preparaDatos(elemento)
        '''
        caracteres_malos = ['\n','\t','\\n','\\t','u']
        for caracter in caracteres_malos:
                d = str(d).replace(caracter,"")
        d = str(d).split(',0 ')
        del d[len(d)-1]
        return d

def datosFin(n,r):
        '''
        Función que devuelve los datos preparados
        datosFin(nombre_del_Archivo,ruta_De_Archivo)
        '''
        tot = r+'/'+n
        
        tot = buscaXMLTag(tot,'coordinates')
        tot = preparaDatos(tot[0])
        return tot

def procesaKML(ar,nom):
        '''
        Lee los datos y los añade a un .txt
        procesaKML(ruta y archivo, archivo, shape_id)
        ar: List
        nom: String
        dest: String
        '''
        fuente = 'New_Files/'+nom
        destino = 'Treated_Files/'
        txt = 'TXT_Files/Shapes.txt'
        contador = 1
        shape_id = nom.split('.')
        if tempfile._exists(txt):
                f = open(txt,'a')
                for i in ar:
                        par = str(i).replace(",",";")
                        escritura = str(shape_id[0])+";"+str(contador)+';'+par+"\n"
                        f.write(escritura)
                        print escritura
                        contador +=1
        else:
                f = open(txt,'a')
                f.write('Shape_id,Point_id,X,Y\n')
                for i in ar:
                        par = str(i).replace(",",";")
                        escritura = str(shape_id[0])+";"+str(contador)+';'+par+"\n"
                        f.write(escritura)
                        print escritura
                        contador +=1
        f.close()
        f.close()

        try:
                shutil.move(fuente,destino)
        except:
                print "Error Shutil"
        
        print '\n\nArchivo '+str(txt)+' actualizado con éxito.'
        print 'Archivo '+str(nom)+' movido a: '+ destino
        

#### FIN FUNCIONES ####


#### PROCESAMIENTO ####

ruta_fuente = 'New_Files'

ficheros = os.listdir(ruta_fuente)
'''
for archivo in ficheros:
        datos = datosFin(archivo,ruta_fuente)
        procesaKML(datos,str(archivo))
'''
#### FIN PROCESAMIENTO ####
¡Gracias por adelantado!
__________________
Hello World!
  #2 (permalink)  
Antiguo 12/04/2013, 10:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: KML Converter

1.- Podrias poner el archivo .kml que hace que tu codigo no corra?
2.- Hay librerías como pyKML que hacen todo el trabajo por ti. Solo para que te puedas concentrar en la parte interesante.
  #3 (permalink)  
Antiguo 15/04/2013, 02:07
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: KML Converter

He mirado la librería pero me pide que tenga instalado el módulo lxml y no consigo dar con la manera de instalarlo.

Cita:
pyKML necesita lxml.
lxml necesita libxml2 y libxslt.
He probado a hacer imports de lxml, libxml2 y de libxslt y todos me dan error. Uso un Snow Leopard (Mac OSX 10.6.8). ¿Alguien sabe cómo puedo instalarlos? He mirado en los manuales correspondientes pero son un maldito lío, que si pip-installer, que si nosequé. ¿Alguien me ayuda por favor?

¡Gracias de antemano!
__________________
Hello World!
  #4 (permalink)  
Antiguo 15/04/2013, 10:19
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: KML Converter

Si haces un `pip install pyKML` te instala automáticamente las dependencias.

O si prefieres instalarlo directo del código.
http://stackoverflow.com/questions/1...cports-or-fink
  #5 (permalink)  
Antiguo 16/04/2013, 01:40
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: KML Converter

Gracias por las respuestas Razpeitia.

Aún no he conseguido hacerme con el dichoso pyKML. Resulta que cuando en mi línea de comandos escribo lo de 'pip install pyKML' me devuelve un error de SSL:


Código:
pip install pyKML
Downloading/unpacking pyKML
  Could not fetch URL https://pypi.python.org/simple/pyKML/: There was a problem confirming the ssl certificate: <urlopen error [Errno 1] _ssl.c:503: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm>
Will skip URL https://pypi.python.org/simple/pyKML/ when looking for download links for pyKML

Could not fetch URL https://pypi.python.org/simple/: There was a problem confirming the ssl certificate: <urlopen error [Errno 1] _ssl.c:503: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm>
Will skip URL https://pypi.python.org/simple/ when looking for download links for pyKML

Cannot fetch index base URL https://pypi.python.org/simple/

Could not fetch URL https://pypi.python.org/simple/pyKML/: There was a problem confirming the ssl certificate: <urlopen error [Errno 1] _ssl.c:503: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm>

Will skip URL https://pypi.python.org/simple/pyKML/ when looking for download links for pyKML

Could not find any downloads that satisfy the requirement pyKML
No distributions at all found for pyKML 

¿Alguna idea de cómo solucionarlo? ¡Gracias!

Edito:

Al intentar seguir los pasos de el link que me dejaste me salta otro error de consola:

Cita:
Thanks to @jessenoller on Twitter I have an answer that fits my needs - you can compile lxml with static dependencies, hence avoiding messing with the libxml2 that ships with OS X. Here's what worked for me:

Código:
cd /tmp
wget http://lxml.de/files/lxml-2.2.2.tgz
tar -xzvf lxml-2.2.2.tgz 
cd lxml-2.2.2
python setup.py build --static-deps --libxml2-version=2.7.3  --libxslt-version=1.1.24 
sudo python setup.py install
Código:
$ wget http://lxml.de/files/lxml-2.2.2.tgz
-bash: wget: command not found
__________________
Hello World!

Última edición por Zeronomi; 16/04/2013 a las 01:47
  #6 (permalink)  
Antiguo 16/04/2013, 10:12
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: KML Converter

El segundo error es por que no tienes instalado wget, su usas una distro basada en debian prueba así:

Código BASH:
Ver original
  1. sudo apt-get install wget

Edito: No leí que usabas mac, lo siento.

Saludos
__________________
Grupo Telegram Docker en Español

Última edición por Carlangueitor; 16/04/2013 a las 10:32
  #7 (permalink)  
Antiguo 16/04/2013, 10:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: KML Converter

El problema es que necesitas actualizar pip y probablemente python.

Aquí hay un tema completo.
https://github.com/pypa/pip/issues/829

Te recomiendo que instales pyhton por separado en Mac OS X por que la versión que trae es una versión modificada.

Código:
cd /tmp # Ve a la carpeta /tmp
wget http://lxml.de/files/lxml-2.2.2.tgz # Descarga http://lxml.de/files/lxml-2.2.2.tgz
tar -xzvf lxml-2.2.2.tgz # Descomprime lxml-2.2.2.tgz
cd lxml-2.2.2 # Entra a la carpeta lxml-2.2.2
python setup.py build --static-deps --libxml2-version=2.7.3  --libxslt-version=1.1.24 # Compila lxml
sudo python setup.py install # Instala lxml
Si no funciona wget o tar, supongo que puedes hacer los pasos manual.
  #8 (permalink)  
Antiguo 17/04/2013, 02:47
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: KML Converter

Tengo instalado el python de [URL="http://www.python.org"]www.python.org[/URL]. Ya que cuando empecé con Python (hará unos dos meses) no tenía ni idea de que venía instalado en el mac.


Cita:
Código:
$ python
Python 2.7.4 (v2.7.4:026ee0057e2d, Apr  6 2013, 11:43:10) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Otra duda, (joder lo siento por irme tantísimo del hilo pero es que soy un poco negado para la línea de comandos xD) ¿Cómo sé a qué versión de Python están apuntando mis librerías? ¿Es posible que se hayan instalado apuntando a la versión por defecto de Mac? Si es así... ¿Cómo las cambio?

He estado leyendo cosas en internet de fallos con el Path, pero no sé cómo cambiarlo ni como saber si está bien.

De verdad. ¡GRACIAS!


EDIT:

Cita:
Código:
cd /tmp # Ve a la carpeta /tmp
wget http://lxml.de/files/lxml-2.2.2.tgz # Descarga http://lxml.de/files/lxml-2.2.2.tgz
tar -xzvf lxml-2.2.2.tgz # Descomprime lxml-2.2.2.tgz
cd lxml-2.2.2 # Entra a la carpeta lxml-2.2.2
python setup.py build --static-deps --libxml2-version=2.7.3  --libxslt-version=1.1.24 # Compila lxml
sudo python setup.py install # Instala lxml
Si no funciona wget o tar, supongo que puedes hacer los pasos manual.
No me funciona wget. ¿Cómo lo hago manualmente?

EDIT2:
He encontrado por internet que el comando $curl -O hace lo mismo que wget. Así que continúo tus paso Razpeitia.
__________________
Hello World!

Última edición por Zeronomi; 17/04/2013 a las 03:17
  #9 (permalink)  
Antiguo 17/04/2013, 03:53
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: KML Converter

Bueno, al final no tengo ni la más pajolera de las ideas de cómo lo he hecho, me he liado a escribir comandos en el terminal y al final parece que lo he conseguido. Al menos no me salta el fallo en el import.

Muchísimas gracias a todos por la ayuda. Jamás lo hubiese conseguido sin vosotros.
__________________
Hello World!

Etiquetas: kml, procesador, tiempo, txt
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 11:40.