Python - Modificar archivo de texto quitando espacios...

   
Vista:
Imágen de perfil de Dani

Modificar archivo de texto quitando espacios...

Publicado por Dani (2 intervenciones) el 27/02/2014 15:12:19
Buenas:

Me estoy iniciando en Python, seguí varias guías pero al final siempre se me olvida casi todo lo que aprendo así que quiero aplicarlo a algo real para practicar.

Me llamo Dani y soy técnico de sistemas acostumbrado a programar cosillas sencillas en C, java, powershell y scripts CMD. Ahora me he planteado un reto más grande. Tengo un log que ocupa la friolera de 1,5 GB que importo a un Access para hacer datamining y obtener consultas y estadísticas. El problema es que hace meses, debido a una actualización, esos logs no solo crecen en demasía sino que modifica la estructura y ya no puedo importar las columnas por tabulación sino que tengo que hacer magia...

Los logs, vienen de esta guisa: ...src_port=56663 src_int="port1"..., con lo que simplemente elimino las comillas dobles y los espacios los convierto por punto y coma para luego importarlo a Access. El problema viene por dos cosas, la primera es que ocupa mucho y no lo puedo hacer los reemplazos ni con wordpad, notepad++, etc, y el segundo es que algunas filas, tienen un este tipo ...src_port=56663 src_int="port1" country="United States"... con lo que el espacio del país lo sustituye por punto y coma y ya no cuatra en el access con lo que no se puede importar correctamente en cada columna.

Aunque lo podría hacer con java, mi idea era hacerlo con python para aprovechar y desoxidar mis conocimientos...

Para el tema del tamaño del archivo pensaba partirlo en tres de 500 MB cada uno.

Para el tema del espacio de las palabras dentro de las comillar, creo que puedo recorrer el documento sin hacer nada hasta encontrar unas comillas dobles y cuando esto ocurra, recorrer caracter por caracter hasta llegar a dos situaciones: 1.- Encuentra un espacio = Lo borra. 2.- Encuentra otra comillas doble = deja de recorrer caracter por caracter y vuelve a buscar la siguiente comillas dobles.

¿Alguien me puede echar una mano?

Con este bucle recorro el fichero origen.txt y lo guardo en destino, así que puedo aprovecharlo para meter ahí el resto de operaciones...

1
2
3
4
5
6
7
if __name__ == "__main__":
   f = open("origen.txt")
   g = open("destino.txt","w")
   for linea in f:
      g.write(linea)
   g.close()
   f.close()

Fuente: http://chuwiki.chuidiang.org/index.php?title=Leer_y_escribir_ficheros_en_python.

Saludos
Dani
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Modificar archivo de texto quitando espacios...

Publicado por xve (1229 intervenciones) el 27/02/2014 15:56:51
Hola Dani, nos puedes mostrar unas lineas del archivo? para poder hacer pruebas con contenido real?

sobre el código que nos muestras, no crees que seria mejor utilizas expresiones regulares en vez de recorrer todo el archivo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Dani

Modificar archivo de texto quitando espacios...

Publicado por Dani (2 intervenciones) el 28/02/2014 13:15:15
Siii, faltaría más.

El archivo de texto tiene miles de filas como esta cada una dice algo relacionado con un evento de un firewall.

Este es el log:

2013-12-30 23:50:26 Local7.Warning 10.55.15.55 date=2013-12-30 time=23:50:21 devname=FG900D device_id=FG900D log_id=0038000007 type=traffic subtype=other pri=warning vd=root src=66.1.1.3 src_port=37751 src_int="wan1" dst=88.20.1.3 dst_port=25 dst_int="dmz" SN=5427 status=deny policyid=26 dst_country="Spain" src_country="United States" service=SMTP proto=6 duration=8784300 sent=0 rcvd=0 msg="replay packet(allow_err), drop"
2013-12-30 23:50:32 Local7.Warning 10.55.15.55 date=2013-12-30 time=23:50:29 devname=FG900D device_id=FG900D log_id=0038000007 type=traffic subtype=other pri=warning vd=root src=172.28.5.100 src_port=33012 src_int="dmz" dst=88.20.1.3 dst_port=80 dst_int=unknown-0 SN=0 status=deny policyid=0 dst_country="Germany" src_country="Reserved" service=HTTP proto=6 duration=8784305 sent=0 rcvd=0 msg="no session matched"
2013-12-30 23:50:34 Local7.Warning 10.55.15.55 date=2013-12-30 time=23:50:34 devname=FG900D device_id=FG900D log_id=0038000007 type=traffic subtype=other pri=warning vd=root src=172.28.5.100 src_port=48109 src_int="dmz" dst=88.20.1.3 dst_port=80 dst_int=unknown-0 SN=0 status=deny policyid=0 dst_country="Germany" src_country="Reserved" service=HTTP proto=6 duration=8784308 sent=0 rcvd=0 msg="no session matched"
2013-12-30 23:50:41 Local7.Warning 10.55.15.55 date=2013-12-30 time=23:50:40 devname=FG900D device_id=FG900D log_id=0038000007 type=traffic subtype=other pri=warning vd=root src=77.2.1.200 src_port=34631 src_int="wan1" dst=88.20.1.3 dst_port=25 dst_int="dmz" SN=5480 status=deny policyid=26 dst_country="Spain" src_country="United States" service=SMTP proto=6 duration=8784315 sent=0 rcvd=0 msg="replay packet(allow_err), drop"
2013-12-30 23:50:43 Local7.Warning 10.55.15.55 date=2013-12-30 time=23:50:43 devname=FG900D device_id=FG900D log_id=0038000007 type=traffic subtype=other pri=warning vd=root src=10.55.1.156 src_port=60614 src_int="port1" dst=88.20.1.3 dst_port=25 dst_int="dmz" SN=5489 status=deny policyid=26 dst_country="Spain" src_country="Reserved" service=SMTP proto=6 duration=8784317 sent=0 rcvd=0 msg="replay packet(allow_err), drop"



Lo de recorrer el log entero era para copiarlo en otro fichero tal cual pero reemplazando los espacios de las palabras compuestas que hay dentro de las comillas, pero bueno, igual se puede hacer de otra manera...

Gracias
Saludos
Dani
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar