Ce billet était initialement paru sur le blog Pydéfis.
Le module python fileinput
sert à faire la même
chose que ARGF
en Ruby, mais il est tellement discret que je n’ai
appris son existence qu’après quelques années…
Supposons qu’on veuille savoir le nombre de caractères de chaque ligne
d’une fichier ou d’un groupe de fichier. À supposer que le fichier
ballade.txt
contienne (pourquoi pas…) :
Dictes moy où, n’en quel pays,
Est Flora, la belle Romaine ;
Archipiada, ne Thaïs,
Qui fut sa cousine germaine ;
Echo, parlant quand bruyt on maine
Dessus rivière ou sus estan,
Qui beauté eut trop plus qu’humaine ?
Mais où sont les neiges d’antan !
On aimerait pouvoir écrire :
compte.py ballade.txt
ou encore :
cat compte.txt | compte.py
Et dans les deux cas, on veut obtenir :
030 Dictes moy où, ...
029 Est Flora, la b...
021 Archipiada, ne ...
029 Qui fut sa cous...
034 Echo, parlant q...
028 Dessus rivière ...
037 Qui beauté eut ...
033 Mais où sont le...
Le module fileinput
est fait pour ça. Il permet d’écrire du code qui
marchera qu’on donne des noms de fichiers sur la ligne de commande ou
leur contenu sur l’entrée standard. Et pour ne rien gâcher c’est très
simple à utiliser :
#!/bin/env python
# ou /bin/env python3
import fileinput
for line in fileinput.input():
line = line.strip()
print("{lg:03d} {ligne}...".format(lg=len(line), ligne=line[:15]))
fileinput.input()
… ça sert partout et tout le temps. On peut faire
sans, mais c’est tellement mieux avec…