2011-01-17 28 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 ha un elenco di nickname, come posso stampare ogni riga dal file in una sola volta ?. Il codice che ho stampato è solo il primo soprannome. Il tuo aiuto sarà apprezzato. Grazie.come stampare ogni riga in un file python

+0

"f.close()" non è compreso nel ciclo for? Inoltre, 'per riga aperta ('masters.txt'):' dovrebbe fare. –

+0

umm che non funziona, continua a stampare la prima riga circa 5 volte – SourD

+0

Questo perché il tuo codice legge solo una riga - viene fatta una sola chiamata a 'readline()'. 'lines' contiene solo una riga (che ha una nuova riga finale, BTW). Un altro problema è che dopo aver 'print' e' sck.send() 'quella singola riga in' lines' per la prima volta, si chiude il file in modo da non poterne più leggere se ci provi.Tuttavia, il 'for' tenterà di mantenere l'esecuzione per ogni carattere * * nella riga,' print'ing e 'sck.send()' occupando sempre la stessa riga fino a quando non si verifica un errore. – martineau

risposta

19

Innanzitutto, come @ l33tnerd detto, f.close dovrebbe essere al di fuori del ciclo.

In secondo luogo, si chiama solo readline una volta, prima del ciclo. Questo legge solo la prima riga. Il trucco è che in Python, file si comportano come iteratori, in modo da poter iterare il file senza dover chiamare qualsiasi metodo su di esso, e che vi darà una linea per ogni iterazione:

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

Infine, si stia riferendo alla variabile lines all'interno del ciclo; Suppongo che intendessi riferirsi a line.

Modifica: Oh ed è necessario indentare il contenuto dell'istruzione if.

+1

Anche 'print line' dovrebbe avere una virgola alla fine per evitare la doppia spaziatura. – mgiuca

+2

Per lo stesso motivo, 'sck.send()' probabilmente non ha bisogno di un ''\ r \ n'' alla fine. – martineau

+0

Oh si. Ho dimenticato persino di vedere cosa stava facendo 'sck.send'. Non ha nemmeno bisogno del 'str' neanche. Quindi dovrebbe essere semplicemente 'sck.send ('PRIVMSG' + chan +" "+ line)', o meglio ancora, 'sck.send (" PRIVMSG% d% s "% (chan, line))'. – mgiuca

7

probabilmente si desidera qualcosa di simile:

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') 

Non chiudere ogni iterazione del ciclo e stampare la linea, invece di linee. Usa anche i readlines per ottenere tutte le linee.

EDIT rimosso la mia altra risposta - l'altro in questa discussione è un'alternativa migliore di quello che avevo, quindi non c'è motivo di copiarlo.

spogliato anche fuori dal \ n con read(). Splitlines()

+1

Che funzionerà, ma la mia soluzione è (solitamente) migliore in quanto non leggerà prima l'intero file in memoria; elaborerà ogni riga mentre la legge dal file. Lo svantaggio del mio è che non puoi chiudere il file finché non hai finito. – mgiuca

+1

@mgiuca - il poster non ha mai menzionato nulla sulla dimensione del file. La memoria non sarà un problema se il file è piccolo, cosa che presumo sarà una lista di nickname. –

+2

Sì, in generale penso che sia una buona pratica non usare la memoria O (N) se riesci a farla franca usando O (1) senza troppi problemi. – mgiuca

0

Hai provato

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

?

readline() 

legge solo "una linea", d'altra parte

readlines() 

legge linee intere e ti dà un elenco di tutte le linee.

+1

È possibile eliminare completamente la chiamata readlines(). – wheaties

+0

Ancora più importante 'readlines()' legge l'intero file in memoria con ogni linea e la sua riga finale intatta, così la 'linea di stampa 'ne produrrà due. Anche lo stile di codifica 'for line in open()' che legge il codice di lettura lascia il file aperto dopo che il ciclo termina poiché non c'è modo di riferirsi nuovamente a 'close()' it. – martineau

+0

hmm, non lo sapevo .. Grazie per i commenti;) –

4

Si potrebbe provare questo. Non legge tutto il contenuto della memoria in una volta sola (usando l'iteratore dell'oggetto file) e chiude il file quando il codice lascia il blocco 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') 

Se si utilizza una versione precedente di python (pre 2.6) dovrete avere

from __future__ import with_statement 
2

loop attraverso il file.

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