Domanda

Sto scrivendo uno script che registra gli errori da un altro programma e riavvia il programma da dove si era interrotto quando si verifica un errore. Per qualsiasi motivo, gli sviluppatori di questo programma non hanno ritenuto necessario mettere questa funzionalità nel loro programma di default.

Comunque, il programma prende un file di input, lo analizza e crea un file di output. Il file di input è in un formato specifico:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

Quando il programma genera un errore, fornisce le informazioni di riferimento necessarie per tenere traccia dell'errore, ovvero l'interfaccia utente, quale sezione (titolo o estratto) e il numero di riga relativo all'inizio del titolo o dell'estratto. Voglio registrare le frasi offensive dal file di input con una funzione che prende il numero di riferimento e il file, trova la frase e la registra. Il modo migliore che mi viene in mente di farlo è spostarmi avanti nel file un numero specifico di volte (ovvero, n volte, dove n è il numero di riga relativo all'inizio della seciton). Il modo in cui sembrava avere senso farlo è:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

Non vedo come questo mi farebbe perdere dati, ma Python pensa che lo farebbe, e dice ValueError: mescolare iterazione e metodi di lettura perderebbe i dati . Qualcuno sa come farlo correttamente?

È stato utile?

Soluzione

Ottieni ValueError perché probabilmente il tuo codice ha per riga nell'originale: oltre a original.readline () . Sta cambiando una soluzione semplice che risolve il problema senza rallentare il programma o consumare più memoria

for line in original:
    ...

a

while True:
    line = original.readline()
    if not line: break
    ...

Altri suggerimenti

Usa per e enumerate .

Esempio:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

NOTA : si presume che tu stia già ripulendo i tuoi handle di file, ecc.

Inoltre, la funzione taketime potrebbe rivelarsi utile se preferisci una sapore più funzionale.

Supponendo che tu abbia bisogno di una sola riga, questo potrebbe essere di aiuto

import itertools

def getline(fobj, line_no):
    "Return a (1-based) line from a file object"
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!

>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'

Potresti voler catturare errori StopIteration (se il file ha meno righe).

Ecco una versione senza il brutto mentre True e senza altri moduli:

for line in iter(original.readline, ''):
    if …:   # to the beginning of the title or abstract
        for i in range(lineNumber):
            print original.readline(),
        break
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top