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:
¡Gracias por adelantado! ''' 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 ####