Ésta es la forma más breve posible:
for line in open(filename):
if line.startswith('#'):
continue
# PROCESS LINE HERE
El método startswith()
en una cadena devuelve True si la cadena que lo llaman en los arranques con la cadena que ha pasado en
Mientras que esto está bien en. En algunas circunstancias, como los guiones de shell, tiene dos problemas. Primero, no especifica cómo abrir el archivo. El modo predeterminado para abrir un archivo es 'r'
, lo que significa 'leer el archivo en modo binario'. Como espera un archivo de texto, es mejor abrirlo con 'rt'
. Aunque esta distinción es irrelevante en los sistemas operativos tipo UNIX, es importante en Windows (y en Mac pre-OS X).
El segundo problema es el identificador de archivo abierto. La función open()
devuelve un objeto de archivo, y se considera buena práctica cerrar archivos cuando haya terminado con ellos. Para hacerlo, llame al método close()
en el objeto. Ahora, Python va a probablemente haga esto por usted, eventualmente; en los objetos de Python se cuentan los recuentos de referencia, y cuando el recuento de referencias de un objeto va a cero se libera, y en algún momento después de liberar un objeto Python llamará a su destructor (un método especial llamado __del__
). Tenga en cuenta que dije probablemente: Python tiene la mala costumbre de no llamar al destructor en objetos cuyo recuento de referencias cae a cero poco antes de que termine el programa. ¡Supongo que tiene prisa!
Para programas de corta vida como scripts de shell, y particularmente para objetos de archivo, esto no importa. Su sistema operativo limpiará automáticamente todos los identificadores de archivos que se hayan dejado abiertos cuando el programa finalice. Pero si abrió el archivo, leyó el contenido y luego inició una computación larga sin cerrar explícitamente el identificador del archivo primero, es probable que Python deje abierto el manejador del archivo durante su cálculo. Y esa es una mala práctica.
Esta versión funcionará en cualquier versión 2.x de Python, y fija tanto los problemas que se discutió anteriormente:
f = open(file, 'rt')
for line in f:
if line.startswith('#'):
continue
# PROCESS LINE HERE
f.close()
Ésta es la mejor forma general para versiones anteriores de Python.
Según lo sugerido por steveha, el uso de la declaración "con" ahora se considera la mejor práctica. Si estás usando 2.6 o superior, debe escribirlo de esta manera:
with open(filename, 'rt') as f:
for line in f:
if line.startswith('#'):
continue
# PROCESS LINE HERE
La declaración "con" borrará el identificador del archivo por usted.
En su pregunta usted dijo "las líneas que comienzan con #", así que eso es lo que te he mostrado aquí. Si desea que se corten las líneas que comienzan con el espacio en blanco opcional y luego un '#', se debe quitar el espacio en blanco antes de buscar el '#'. En ese caso, debe cambiar esta situación:
if line.startswith('#'):
a esto:
if line.lstrip().startswith('#'):
En Python, las cadenas son inmutables, así que esto no cambia el valor de line
. El método lstrip()
devuelve una copia de la cadena con toda su líder en el espacio en blanco eliminado.
si.gracias por notarlo. – ghostdog74
... ignorando los espacios en blanco iniciales: 'if not line.strip(). Startswith (" # ")' – exhuma
Su código tiene 'for line in open (" file "):' que deja un descriptor de archivo abierto. Debes mantener el valor de retorno de 'open (" file ")' y llamar 'close()' sobre él explícitamente cuando hayas terminado, o usar la declaración 'with' (ver http://docs.python.org/ library/stdtypes.html # file.close). –