Text-Processing
如何使 python 程序表現得像適當的 unix 工具?
我有一些 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
如果有標準輸入,則文件輸入庫處理標準輸入,如果有文件,則處理文件。但它迭代單行。
import fileinput for line in fileinput.input(): process(line)
我真的不明白。我想如果您正在處理小文件,或者您沒有對文件做太多事情,這似乎很明顯。但是,就我的目的而言,這比簡單地打開整個文件並將其讀入字元串要慢得多,如上所述。
目前我執行上面的腳本就像
$ pythonscript textfilename1 > textfilename2
但我希望能夠在管道中執行它(及其兄弟),比如
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2
為什麼不只是
files = sys.argv[1:] if not files: files = ["/dev/stdin"] for file in files: f = open(file) ...
檢查文件名是否作為參數給出,或者從
sys.stdin
.像這樣的東西:
if sys.argv[1]: f = open(sys.argv[1]) else: f = sys.stdin
它類似於 Mikel 的答案,只是它使用了
sys
模組。我想如果他們把它放在那裡,那一定是有原因的……