2011-01-17 17 views
8
 if data.find('!masters') != -1: 
     f = open('masters.txt') 
     lines = f.readline() 
     for line in lines: 
       print lines 
       sck.send('PRIVMSG ' + chan + " " + str(lines) + '\r\n') 
       f.close() 

masters.txt tiene una lista de apodos, ¿cómo puedo imprimir cada línea del archivo a la vez ?. El código que tengo solo imprime el primer apodo. Su ayuda será apreciada. Gracias.cómo dar salida a cada línea en un archivo python

+0

¿Debería 'f.close()' estar fuera del ciclo for? Además, solo 'for line in open ('masters.txt'):' debería hacer. –

+0

umm que no funciona, sigue imprimiendo en la primera línea unas 5 veces – SourD

+0

Esto se debe a que su código solo lee una línea, solo se realiza una llamada a 'readline()'. 'lines' solo contiene una línea (que tiene una nueva línea al final, BTW). Otro problema es que después de 'print' y' sck.send() 'esa única línea en' lines' la primera vez, cierra el archivo para que no pueda leer más si lo intentó.Sin embargo, el 'for' intentará seguir ejecutando para cada * carácter * en la línea,' print'ing y 'sck.send()' ing la misma línea una y otra vez hasta que ocurra o no un error. – martineau

Respuesta

19

primer lugar, como @ l33tnerd dicho, f.close debe estar fuera del bucle.

En segundo lugar, solo llama al readline una vez antes del ciclo. Eso solo dice la primera línea. El truco es que en Python, archivos actúan como iteradores, por lo que puede iterar sobre el archivo sin tener que llamar a cualquier método en él, y que le dará una línea por cada iteración:

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    for line in f: 
      print line, 
      sck.send('PRIVMSG ' + chan + " " + line) 
    f.close() 

último, que se está refiriendo a la variable lines dentro del bucle; Supongo que querías referirte al line.

Editar: Ah, y tiene que sangrar el contenido de la declaración if.

+1

También 'print line' debe tener una coma al final para evitar el doble espacio. – mgiuca

+2

Por la misma razón, el 'sck.send()' probablemente no necesite un ''\ r \ n'' al final. – martineau

+0

Oh sí. Me olvidé de mirar lo que 'sck.send' estaba haciendo. Realmente no necesita el 'str' tampoco. Entonces debería ser 'sck.send ('PRIVMSG' + chan +" "+ línea)', o mejor aún, 'sck.send (" PRIVMSG% d% s "% (chan, línea))'. – mgiuca

7

es probable que desee algo como:

if data.find('!masters') != -1: 
    f = open('masters.txt') 
    lines = f.read().splitlines() 
    f.close() 
    for line in lines: 
     print line 
     sck.send('PRIVMSG ' + chan + " " + str(line) + '\r\n') 

No cierre cada iteración del bucle de la línea e imprimir en lugar de líneas. También use readlines para obtener todas las líneas.

EDIT eliminado mi otra respuesta - la otra en esta discusión es una mejor alternativa que la que tenía, por lo que no hay razón para copiarla.

también se desnudó el \ n con read(). Splitlines()

+1

Eso funcionará, pero mi solución es (generalmente) mejor ya que no leerá todo el archivo en la memoria primero; procesará cada línea tal como la lee desde el archivo. La desventaja de la mía es que no puedes cerrar el archivo hasta que hayas terminado. – mgiuca

+1

@mgiuca - el cartel nunca mencionó nada sobre el tamaño del archivo. La memoria no será un problema si el archivo es pequeño, lo que supongo que será una lista de apodos. –

+2

Sí, en general creo que es una buena práctica no usar memoria O (N) si puede salirse con la suya usando O (1) sin demasiados problemas. – mgiuca

0

¿Usted intentó

for line in open("masters", "r").readlines(): print line 

?

readline() 

sólo lee "una línea", por el contrario

readlines() 

lee líneas enteras y le da una lista de todas las líneas.

+1

Puede deshacerse de la llamada readlines() por completo. – wheaties

+0

Más importante aún 'readlines()' lee el archivo completo en la memoria con cada línea y su línea nueva final intacta, por lo que la 'línea de impresión' dará salida a dos de ellos. El estilo de codificación de lectura de archivo 'for line in open()' también deja el archivo abierto después de que termine el bucle, ya que no hay forma de volver a consultarlo y 'close()' it. – martineau

+0

hmm, no lo sabía ... Gracias por los comentarios;) –

4

Puede probar esto. No lee todo f en la memoria a la vez (utilizando el iterador del objeto de archivo) y cierra el archivo cuando el código sale del bloque con.

if data.find('!masters') != -1: 
    with open('masters.txt', 'r') as f: 
     for line in f: 
      print line 
      sck.send('PRIVMSG ' + chan + " " + line + '\r\n') 

Si está utilizando una versión anterior de Python (pre 2.6) que tendrá que tener

from __future__ import with_statement 
2

bucle a través del archivo.

f = open("masters.txt") 
lines = f.readlines() 
for line in lines: 
    print line 
Cuestiones relacionadas