dernière modification : 2023

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.