nuevo "programando"

Arnau Sanchez arnau en ehas.org
Jue Jul 12 15:21:33 CEST 2007


hmanzano en labein.es escribió:

> Hola a todos, soy nuevo en esto de la programación, o más bien hacer 
> pequeños scripts, estoy aprendiendo y me han recomendado python por ser un 
> lenguaje claro y sencillo. Mi problema es que para alguna cosa tengo 
> prisa. Explico lo que quiero hacer:
> 
> Tengo un  archivo x de unas 2000 lineas, de las cuales me interesan 300. 
> Empiezan por la palabra "     frecuencia" con espacios. Lo que quiero 
> hacer es que me escriba esas lineas en otro archivo de salida, digamos y. 
> Con l comando

Esta es una duda bastante típica, así que tenía su entrada en el FAQ que 
acabamos de crear. Aprovechando tu pregunta, la he completado con el problema 
que planteas:

http://pythonesfaq.k-rolus.net/#index21h3

La solución que usa expresiones regulares no me acaba de gustar, seguro que a 
alguien se le ocurre alguna forma mejor.

1ª propuesta: usando métodos de cadena.

     output = file("salida.txt", "w")
     for line in file("entrada.txt"):
         if line.lstrip().startswith("frecuencia"):
             output.write(line)
     output.close()

2ª propuesta: usando métodos de cadena y el método *writelines* con generadores.

     output = file("salida.txt", "w")
     condition = lambda s: s.lstrip().startswith("frecuencia")
     output.writelines(line for line in file("entrada.txt") if condition(line))
     output.close()

3ª propuesta: usando métodos de cadena, y leyendo/escribiendo en una misma línea 
con generadores (poco claro).

     condition = lambda s: s.lstrip().startswith("frecuencia")
     file("salida.txt", "w").writelines(line for line in file("entrada.txt") if 
condition(line))

4ª propuesta: usando expresiones regulares. En este caso tan simple no está 
justificado, pero a veces la búsqueda puede ser más compleja y entonces sí puede 
ser útil.

     import re
     output = file("salida.txt", "w")
     pat = re.compile("^(\s*frecuencia.*)$", re.MULTILINE)
     addlf = lambda iterator: ("%s\n"%s for s in iterator)
     output.writelines(addlf(pat.findall(file("entrada.txt").read())))
     output.close()




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