J'ai quelques scripts Python qui traînent et je travaille à les réécrire. J'ai le même problème avec chacun d'eux.
Il n'est pas évident pour moi d'écrire les programmes pour qu'ils se comportent comme des outils Unix appropriés.
Car ce
$ cat characters | progname
et ça
$ progname characters
devrait produire la même sortie.
La chose la plus proche que j'ai pu trouver en Python était la bibliothèque d'entrée de fichiers. Malheureusement, je ne vois pas vraiment comment réécrire mes scripts Python, qui ressemblent tous à ceci:
#!/usr/bin/env python
# coding=UTF-8
import sys, re
for file in sys.argv[1:]:
f = open(file)
fs = f.read()
regexnl = re.compile('[^\s\w.,?!:;-]')
rstuff = regexnl.sub('', fs)
f.close()
print rstuff
La bibliothèque fileinput traite stdin s'il y a un stdin et traite un fichier s'il y a un fichier. Mais il itère sur des lignes simples.
import fileinput
for line in fileinput.input():
process(line)
Je ne comprends vraiment pas cela. Je suppose que si vous traitez de petits fichiers ou si vous ne faites pas grand-chose avec les fichiers, cela peut sembler évident. Mais, pour mes besoins, cela est beaucoup plus lent que d'ouvrir simplement le fichier entier et de le lire dans une chaîne, comme ci-dessus.
Actuellement, je lance le script ci-dessus comme
$ pythonscript textfilename1 > textfilename2
Mais je veux pouvoir le faire fonctionner (et ses frères) dans des tuyaux, comme
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2