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…