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

Chema Cortes chemacortes en wanadoo.es
Jue Ago 22 14:26:21 CEST 2002


> Hernan Martinez Foffani dijo:
> > si my_file fuera una lista de listas, sería:
> > my_file[0][1]
> 
> ¿Y esto está en el tutorial? Debo andar ciega total :-)

Al final de la sección 3.1.4, aunque casi no se ve.

> El script queda así:
> 
> #!/usr/bin/python
> import re, string
> my_file = open('amaya', 'r')
> line_num = 0
> #i = 0
> #j = i + 1
> 
> i = j = 0
> 
> my_log = []
> for line in my_file:
>         line_num  = line_num + 1
>         row_elem  = string.split(line)

Por comentar un poco, el módulo string ya se está dejando de usar. Puedes emplear mejor los métodos del objeto:

 row_elem = line.split()

>         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_log.insert (line_num, param)
>         my_log.append(param)
> my_file.close()
> 
> while i < line_num:
>         print my_log[i]
> #       while j < len(param):
> #       print my_log[i][j]
> #               j = j + 1 
> #               i = i + 1
>         i = i + 1

Queda más elegante de esta forma:

for  line in my_log:
  print line

> Pero si descomento y "arreglo" el último while:
> 
> while i < line_num:
>         while j < len(param):
> 	        print my_log[i][j]
>                 j = j + 1 
>                 i = i + 1
> 
> Entonces se me queja:

Tienes que identar correctamente el incremento de 'i'

> Si en cambio pruebo esto (porque programo de oído ;-)))):
> 
> while i < line_num:
>         while j < len(param):
>                 print my_log[i][j]
>                 j = j + 1
>         i = i + 1 
> 
> Me imprime esto:
> [arodrigo en cuelebre iptables]$ python amaya.py 
> 1
> Aug 22
> 09:35:23
> SRC=192.168.3.9
> DST=192.168.3.11
> SPT=37192
> DPT=80
> SEQ=1899023795
> ACK=0

Aquí tenías bien identado 'i', pero deberías haber vuelto a poner 'j' a cero antes de empezar el segundo bucle.

i=0
while i < line_num:
        j=0
        while j < len(param):
                print my_log[i][j]
                j = j + 1
        i = i + 1 

Pero como mejor sería:

for line in my_log:
    for elem in line:
        print elem

Te evitarías todos los líos de usar índices.

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