Ich habe ein paar Python-Skripte herumliegen, und ich arbeite daran, sie umzuschreiben. Ich habe mit allen das gleiche Problem.
Mir ist nicht klar, wie man die Programme so schreibt, dass sie sich wie richtige Unix-Tools verhalten.
Weil das
$ cat characters | progname
und das
$ progname characters
sollte die gleiche Ausgabe erzeugen.
Das Nächste, was ich in Python finden konnte, war die Dateieingabebibliothek. Leider sehe ich nicht wirklich, wie ich meine Python-Skripte umschreiben kann, die alle so aussehen:
#!/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
Die Dateieingabebibliothek verarbeitet stdin, wenn es eine stdin gibt, und verarbeitet eine Datei, wenn es eine Datei gibt. Es wird jedoch über einzelne Zeilen iteriert.
import fileinput
for line in fileinput.input():
process(line)
Das verstehe ich wirklich nicht. Ich denke, wenn Sie mit kleinen Dateien zu tun haben oder wenn Sie nicht viel mit den Dateien tun, scheint dies offensichtlich zu sein. Für meine Zwecke ist dies jedoch viel langsamer als das einfache Öffnen der gesamten Datei und das Einlesen in eine Zeichenfolge, wie oben.
Zur Zeit starte ich das obige Skript gerne
$ pythonscript textfilename1 > textfilename2
Aber ich möchte in der Lage sein, es (und seine Brüder) in Rohren zu betreiben
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2