У мене є кілька сценаріїв Python, і я працюю над їх перезаписом. У мене однакова проблема з усіма ними.
Мені не очевидно, як писати програми, щоб вони поводилися як належні інструменти Unix.
Тому що це
$ cat characters | progname
і це
$ progname characters
повинні давати однаковий вихід.
Найближче, що я міг знайти в Python, це бібліотека файлових входів. На жаль, я не знаю, як переписати свої сценарії 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