Tôi có một vài tập lệnh Python nằm xung quanh và tôi đang viết lại chúng. Tôi có cùng một vấn đề với tất cả chúng.
Tôi không rõ ràng về cách viết chương trình để chúng hoạt động như các công cụ unix thích hợp.
Bởi vì điều này
$ cat characters | progname
và cái này
$ progname characters
nên sản xuất cùng một đầu ra.
Thứ gần nhất tôi có thể tìm thấy trong Python là thư viện fileinput. Thật không may, tôi thực sự không thấy cách viết lại các tập lệnh Python của mình, tất cả đều trông như thế này:
#!/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
Thư viện fileinput xử lý stdin nếu có stdin và xử lý tệp nếu có tệp. Nhưng nó lặp đi lặp lại trên các dòng duy nhất.
import fileinput
for line in fileinput.input():
process(line)
Tôi thực sự không có được điều đó. Tôi đoán nếu bạn đang xử lý các tệp nhỏ hoặc nếu bạn không làm gì nhiều với các tệp, điều này có vẻ rõ ràng. Nhưng, với mục đích của tôi, điều này làm cho nó chậm hơn nhiều so với việc chỉ mở toàn bộ tệp và đọc nó thành một chuỗi, như trên.
Hiện tại tôi chạy đoạn script trên như
$ pythonscript textfilename1 > textfilename2
Nhưng tôi muốn có thể chạy nó (và anh em của nó) trong các đường ống, như
$ grep pattern textfile1 | pythonscript | pythonscript | pythonscript > textfile2