У меня есть несколько скриптов Python, и я работаю над их переписыванием. У меня та же проблема со всеми из них.
Для меня не очевидно, как писать программы, чтобы они вели себя как надлежащие инструменты Unix.
Потому что это
$ cat characters | progname
и это
$ progname characters
должен выдавать тот же результат.
Наиболее близкой вещью, которую я смог найти в Python, была библиотека fileinput. К сожалению, я не вижу, как переписать мои скрипты Python, все из которых выглядят так:
#!/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
Библиотека fileinput обрабатывает stdin, если есть stdin, и обрабатывает файл, если есть файл. Но он повторяется по одной строке.
import fileinput
for line in fileinput.input():
process(line)
Я действительно не понимаю этого. Я думаю, если вы имеете дело с небольшими файлами, или если вы не слишком много делаете для файлов, это может показаться очевидным. Но для моих целей это намного медленнее, чем просто открыть весь файл и прочитать его в строку, как описано выше.
В настоящее время я запускаю скрипт выше, как
$ pythonscript textfilename1 > textfilename2
Но я хочу быть в состоянии запустить его (и его братьев) в трубах, как
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2