Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/04/2013, 08:53
Zeronomi
 
Fecha de Ingreso: enero-2013
Mensajes: 30
Antigüedad: 11 años, 3 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!