Ho alcuni script Python in giro e sto lavorando per riscriverli. Ho lo stesso problema con tutti loro.
Non è ovvio per me come scrivere i programmi in modo che si comportino come strumenti unix adeguati.
Perchè questo
$ cat characters | progname
e questo
$ progname characters
dovrebbe produrre lo stesso output.
La cosa più vicina a Python che ho trovato è stata la libreria fileinput. Sfortunatamente, non vedo davvero come riscrivere i miei script Python, che sembrano tutti così:
#!/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 libreria fileinput elabora stdin se esiste uno stdin ed elabora un file se esiste un file. Ma scorre su singole righe.
import fileinput
for line in fileinput.input():
process(line)
Davvero non capisco. Immagino che se hai a che fare con file di piccole dimensioni o se non stai facendo molto con i file, questo può sembrare ovvio. Ma, per i miei scopi, questo rende molto più lento che semplicemente aprire l'intero file e leggerlo in una stringa, come sopra.
Attualmente eseguo lo script sopra come
$ pythonscript textfilename1 > textfilename2
Ma voglio essere in grado di eseguirlo (e i suoi fratelli) in pipe, come
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2