Mam kilka skryptów Pythona i pracuję nad ich napisaniem. Mam ten sam problem ze wszystkimi.
Nie jest dla mnie oczywiste, jak pisać programy, aby działały jak właściwe narzędzia uniksowe.
Ponieważ to
$ cat characters | progname
i to
$ progname characters
powinien generować ten sam wynik.
Najbliższą rzeczą, jaką mogłem znaleźć w Pythonie, była biblioteka fileinput. Niestety tak naprawdę nie widzę, jak przepisać moje skrypty w języku Python, z których wszystkie wyglądają tak:
#!/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
Biblioteka fileinput przetwarza stdin, jeśli istnieje stdin, i przetwarza plik, jeśli istnieje plik. Ale iteruje się po pojedynczych liniach.
import fileinput
for line in fileinput.input():
process(line)
Naprawdę tego nie rozumiem. Myślę, że jeśli masz do czynienia z małymi plikami lub jeśli nie robisz wiele z plikami, może to wydawać się oczywiste. Ale dla moich celów jest to znacznie wolniejsze niż po prostu otwieranie całego pliku i wczytywanie go w ciąg znaków, jak powyżej.
Obecnie uruchamiam skrypt powyżej jak
$ pythonscript textfilename1 > textfilename2
Ale chcę być w stanie uruchomić go (i jego braci) w fajkach
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2