Text-Processing

如何使 python 程序表現得像適當的 unix 工具?

  • January 14, 2019

我有一些 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模組。我想如果他們把它放在那裡,那一定是有原因的……

引用自:https://unix.stackexchange.com/questions/47098