Borrar un linea de un archivo

Chema Cortes py en ls-l.org
Lun Jul 18 10:32:25 CEST 2005


Luis Tomas Wayar escribió:
> Hola estimado pythonadictos. Estoy tratando de borrar una linea de un archivo de texto, se trata de reglas de un firewall,
> lo que hago es lo siguiente:
> 
> 1.- Cargo el archivos en una lista
> 2.- Iteratuo con la lista para buscar las lineas que contienen un numero ip
> 3.- borro de la lista el elemento que cumple la condicion
> 
> Ahora el problema, me borra bien los elementos de la lista -1, es decir me deja el ultimo elemento que conicide con la condicion.
> 
> Ahora las preguntas: 
> 
> 1.- Que hago mal?
> 2.- Hay alguna forma mejor de hacerlo?

Lo raro es que sólo sea una línea la que te deje sin borrar. Por lo
general, no es buena idea andar modificando en el interior de un bucle
los parámetros que lo controlan.

> 
> A continuacion la funcion:
> 
> def borrar_puesto(ip):
> 	archivo = open("/etc/firewall/gshield.last","r")
> 	reglas = archivo.readlines()
> 	for regla in reglas:
> 		if regla.__contains__(ip):
> 			reglas.remove(regla)

La lista "reglas" la estás alterando dentro del bucle, con lo que el
bucle deja de ser "exhaustivo".

Te propongo unas alternativas:

1.-

  reglas=[]
  for regla in open("/etc/firewall/gshield.last","r"):
    if not ip in regla:
      reglas.append(regla)


2.-

  reglas=[regla in open("/etc/firewall/gshield.last","r")
         if ip not in regla]


3.- lo mismo que la 2, pero con generadores. Es una forma mucho mejor
cuando se trabaja con ficheros enormes.

  reglas=(regla in open("/etc/firewall/gshield.last","r")
         if ip not in regla)




PD: Tampoco está bien que incluyas la clave OpenPGP en la firma.




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