मेरे पास कुछ पायथन स्क्रिप्ट हैं, जो चारों ओर बिछी हुई हैं, और मैं उन्हें फिर से लिखने पर काम कर रहा हूं। मुझे उन सभी के साथ एक ही समस्या है।
मेरे लिए यह स्पष्ट नहीं है कि कार्यक्रम कैसे लिखें ताकि वे उचित यूनिक्स उपकरणों की तरह व्यवहार करें।
क्योंकि यह
$ cat characters | progname
और इस
$ progname characters
एक ही उत्पादन का उत्पादन करना चाहिए।
पाइथन में जो सबसे करीबी चीज मुझे मिल सकती थी, वह फाइलइनपुट लाइब्रेरी थी। दुर्भाग्य से, मैं वास्तव में अपनी पायथन लिपियों को फिर से लिखने का तरीका नहीं देखता, जो सभी इस तरह दिखते हैं:
#!/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