[Python-es] Re:[Python-es] Duda un poco básica ¿RTFM? ;-)

Chema Cortes chemacortes en wanadoo.es
Jue Ago 22 13:23:37 CEST 2002


> Muy buenas a todos/as. 
> 
> En el trabajo acaban de declarar a Python acomo lenguage oficial de scripting
> del departamento de sistemas, lo cual me llena de gozo por un lado, porque me
> gusta mucho, y me aterra un poco por otro, porque no ando muy suelta.

Es una grata noticia. Yo estoy intentando lo mismo en mi trabajo, pero antes tengo que erradicar el analfabetismo funcional de algunos jefes.

> Estoy considerando adquirir "Learning Python", porque no soy la única por aquí
> que programa de oído ;-) [Metáfora musical]. ¿Alguno tiene una sugerencia mejor?

No hay mucho donde recomendarte. El "Learning Python" está bien como una referencia, pero mi consejo es que utilizes la documentación propia de python, y hacer llamadas al "pydoc" (función help en modo shell). Un libro del que he sacado muy buenas ideas es el que comenté hace unos días "Web programming in python: techniques for integrating linux, apache and mysql".

Ya no puedo prometer nada por los contínuos retrasos que llevo, pero estoy preparando un curso de python ("pytando") que espero dejar listos los primeros capítulos un día de estos.

> Bueno, al grano..
> Estoy parseando unos logs de iptables. Mi programa (de momento) es este:

He mirado el código, y creo que está incompleto:

> #!/usr/bin/python
> import re, string
> file = open('amaya', 'r')

No es un fallo grave, pero te aconsejo que uses 'file()' en lugar de 'open()' para que quede claro que estás inicializando un objeto 'file', y que tampoco uses 'file' como variable.

> line_num = 0
> i,j = 0, i+ 1 

¿Cuánto vale inicialmente 'i'?

> my_file = []
> for line in file.readlines():
> 	line_num  = line_num + 1
> 	row_elem  = string.split(line)
> 	date1     = row_elem[0] + " " + row_elem[1]
> 	date2     = row_elem[2]
> 	match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)')
> 	pattern   = match_pat.search(line)
> 	src_addr  = pattern.group(1)
> 	dst_addr  = pattern.group(2)
> 	src_port  = pattern.group(4)
> 	dst_port  = pattern.group(5)
> 	sequence  = pattern.group(6)
> 	ack_seq   = pattern.group(7)
> 	param     = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq]
> 	my_file.insert (line_num, param)

Aquí insert intenta insertar el elemento 'param' en la posición 'line_num'. Tal como está el código, no hay tantos elementos en 'my_file', con lo que siempre se añade al final de la lista. Hubiera sido mejor haber utilizado el append:

my_file.append(param)


> file.close()
> 
> while i < line_num:
> 	while j < len(param):
> 		print my_file[i]

No veo que se incremente ni 'i' ni 'j'

> El error es este:
> 
> [arodrigo en cuelebre iptables]$ python amaya.py 
> Traceback (most recent call last):
>   File "amaya.py", line 28, in ?
>       print my_file[line_num ]
>  IndexError: list index out of range

Me falta esta línea.

> Yo lo único que quiero es tener una tabla de este estilo:
> 
>  -------------------------------------
> | line_num = 1 | dato1 | dato2 | ... |
>  -------------------------------------
> | line_num = 2 | dato1 | dato2 | ... |
>  -------------------------------------
> |    ...       | dato1 | dato2 | ... |
>  -------------------------------------
> | line_num = n | dato1 | dato2 | ... |
>  -------------------------------------
> 
> y poder recorrerla con algo así como hacía en C o PHP: my_file[0,1] pero no doy
> con cómo hacerlo.

Utiliza: my_file[0][1] (como en C)

Para imprimir, aprovéchate del trabajo hecho:

from pprint import pprint
pprint(my_file)


Si pones el código completo podríamos darte más indicaciones.

Y sobre todo, insiste, que no será tiempo malempleado.

Saludos,
-- 
Chema Cortes (chemacortes en wanadoo.es)
_____________________________________________________________________
Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo 
¡¡ desde las 3 de la tarde!!
Compruébalo en http://www.wanadoo.es/acceso-internet





Más información sobre la lista de distribución Python-es