Filtre en Python
L’objectif ici est de voir comment, en Python, écrire une commande ayant un comportement conforme au standard Unix.
1. Ebauche de filtre en Python
input() lit sur stdin et print() écrit sur stdout,
donc avec cela, il est possible de bricoler un filtre :
convertit le flux de données en majuscule
#!/bin/env python3
try:
while True:
line = input()
print(line.upper())
except EOFError:
pass
Plus pro, on peut utiliser les variables stdin et stdout du module sys :
upper.py
#!/bin/env python3
import sys
for line in sys.stdin:
sys.stdout.write(line.upper())
Cette commande n’a pas le comportement standard d’une commande Unix :
$ cat /etc/passwd | ./upper.py # OK
$ ./upper.py < /etc/passwd # OK
$ ./upper.py /etc/passwd # NOT ok
2. Le module fileinput
Cette commande n’a toujours pas exactement le comportement standard d’une commande Unix
car elle ne sait pas traiter plusieurs fichiers.
C’est ici que le module fileinput intervient,
puisque son but est justement de gérer souplement l’entrée standard du programme qui l’utilise.