5.17 fileinput -- Itera su righe provenienti da più flussi di input

Questo modulo implementa una classe ed alcune funzioni utili per scrivere rapidamente un ciclo che operi sullo standard input o su una lista di file.

L'utilizzo tipico è il seguente:

import fileinput
for line in fileinput.input():
    process(line)

In questo esempio, si itera sulle righe di tutti i file elencati in sys.argv[1:], utilizzando sys.stdin se la lista degli argomenti è vuota. Se il nome di un file passato è '-', viene anch'esso rimpiazzato da sys.stdin. Per specificare una lista alternativa di nomi di file, passatela come primo argomento di input(). È permesso usare anche un singolo nome di file.

Tutti i file vengono aperti in modalità testo. Se si verifica un errore di I/O durante l'apertura o la lettura di un file, viene sollevata un'eccezione IOError.

Se sys.stdin viene utilizzato più di una volta, dopo il primo utilizzo non verrà più restituita alcuna riga, eccetto forse per la modalità interattiva, o se è stato esplicitamente reimpostato (es.: usando sys.stdin.seek(0)).

I file vuoti vengono aperti ed immediatamente chiusi; si può constatare la presenza di questi file nella lista solo quando l'ultimo file aperto è vuoto.

È possibile che l'ultima riga di un file non termini con il carattere di fine riga; le righe vengono restituite insieme al carattere di fine riga terminale, se presente.

La seguente funzione è l'interfaccia base di questo modulo:

input( [files[, inplace[, backup]]])
Crea un'istanza della classe FileInput. L'istanza verrà poi usata come stato globale dalle funzioni di questo modulo, e viene anche restituita per essere usata durante l'iterazione. I parametri di questa funzione verranno passati al costruttore della classe FileInput.

Le seguenti funzioni utilizzano lo stato globale creato da input(); se non è presente uno stato attivo, viene sollevata un'eccezione RuntimeError.

filename( )
Restituisce il nome del file che è attualmente in fase di lettura. Prima della lettura della prima riga del file, viene restituito None.

lineno( )
Restituisce il numero totale di righe appena lette. Prima della lettura di qualsiasi riga restituisce 0. Dopo che è stata letta l'ultima riga dell'ultimo file, restituisce il numero di quella riga.

filelineno( )
Restituisce il numero di righe lette nel file corrente. Prima della lettura della prima riga, restituisce 0. Dopo la lettura dell'ultima riga dell'ultimo file, restituisce il numero di quella riga all'interno di quel file.

isfirstline( )
Restituisce true se la riga appena letta è la prima del relativo file, altrimenti restituisce false.

isstdin( )
Restituisce true se l'ultima riga è stata letta da sys.stdin, altrimenti restituisce false.

nextfile( )
Chiude il file corrente cosicché la successiva iterazione leggerà la prima riga del file successivo (se presente); le righe non lette dal file appena chiuso non verranno aggiunte al conteggio generale di tutte le righe. Il nome del file non sarà aggiornato fino a che non viene letta la prima riga del file successivo. Questa funzione non ha effetto prima della lettura della prima riga del file; quindi non può essere usata per saltare il primo file. Anche dopo la lettura dell'ultima riga dell'ultimo file questa funzione non ha effetto.

close( )
Chiude la sequenza.

Anche la classe che implementa il comportamento sequenziale fornito dal modulo è disponibile per poter essere derivata:

class FileInput( [files[, inplace[, backup]]])
La classe FileInput è l'implementazione; i suoi metodi filename(), lineno(), fileline(), isfirstline(), isstdin(), nextfile() e close() corrispondono alle funzioni con lo stesso nome nel modulo. In aggiunta possiede però un metodo readline() che restituisce la successiva riga di input, ed un metodo __getitem__() che implementa effettivamente il comportamento sequenziale. Si deve accedere alla sequenza in ordine strettamente sequenziale; non si può mescolare l'uso di readline() con un accesso casuale.

Filtro opzionale sul posto: se alla funzione input() o al costruttore di FileInput viene passato l'argomento a parola chiave inplace=1, il file viene spostato in un altro file di backup e lo standard output viene diretto al file di input (se un file dello stesso nome del file di backup già esiste, verrà sovrascritto senza sollevare eccezioni). Questo rende possibile scrivere un filtro che riscrive il suo file di input sul posto. Passando anche l'argomento a parola chiave backup='.<qualche estensione>', si specifica l'estensione che deve avere il file di backup, facendo sì che questo file di backup non venga cancellato; infatti l'estensione predefinita dei file di backup è '.bak', ed essi vengono cancellati dopo la chiusura del file di output. Il filtraggio sul posto viene disabilitate durante la lettura da standard input.

Avvertenze: L'implementazione corrente non funziona con il filesystem 8+3 di MS-DOS.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.