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!