Considérons le programme suivant, intitulé toto.py :
import fileinput for line in fileinput.input(): print line
Si l'on exécute
python toto.py .pythonstartup
alors chaque ligne du fichier .pythonstartup sera lue. Sinon, l'interpréteur attendra que l'utilisateur saisisse quelque chose au clavier.
La méthode fileinput.input() reçoit une liste de fichiers texte à examiner (si la liste est vide, la lecture se fera sur l'entrée standard). Le retour est un Iterator, qui lui-même retourne chaque ligne de chaque texte.
>>> import fileinput >>> from os import listdir >>> for line in fileinput.input(listdir('.')): ... print line
On ne se soucie pas de quel fichier est concerné, ni de son nombre de lignes.
Il y a deux manières de parcourir les lignes des fichiers reçus dans fileinput.input()...
Par exemple :
>>> from os import listdir >>> import fileinput >>> for line in dd: ... print line
On peut utiliser des méthodes de l'itérateur
>>> from os import listdir >>> import fileinput >>> for line in fileinput.input(listdir('.')): ... print line ... print fileinput.filename() ... print fileinput.lineno() ... print fileinput.filelineno() ... print fileinput.isfirstline() ... print fileinput.isstdin() ... fileinput.nextfile() >>> fileinput.close()
Dans ce qui précède, on affiche :
Enfin, on passe au prochain fichier. A la fin, on ferme l'itérateur.
>>> dd=fileinput.input(listdir('.')) >>> dd.readline() '/etc/gdm/Xsession: Beginning session setup...\n'
Si l'argument inplace = 1 est passé à la méthode input() ou au constructeur FileInput(), le fichier sera déplacé dans un fichier backup, et la sortie standart sera redirigée vers le fichier d'entrée.
Un exemple pour bien comprendre l'affaire :
>>> from os import listdir >>> import fileinput >>> dd = fileinput.input(listdir('.'), inplace = 1) >>> for line in dd: ... if line.startswith('i'): ... print 'i'+line
Ici, on parcours toutes les lignes de tous les fichiers du répertoire courant.
Pour remplacer une chaîne (a) par une autre (b), dans tous les fichiers d'un répertoire donné, on peut procéder ainsi :
>>> from os import listdir >>> import fileinput >>> dd = fileinput.input(listdir('.'), inplace = 1) >>> for line in dd: ... print line.replace(a,b)
Par défaut, le fichier backup est écrasé. Si on souhaite le conserver, par exemple avec l'extension '.bak' :
>>> dd = fileinput.input(listdir('.'), inplace = 1, backup = ".bak")
Cette méthode de substitution est cependant assez lente.