2009-04-30 18 views
21

मैं बहुत सी छोटी लिपियों को लिखता हूं जो लाइन-दर-रेखा आधार पर फ़ाइलों को संसाधित करते हैं। पर्ल में, मैंपायथन के पर्ल के बराबर (<>) {...}?

while (<>) { 
    do stuff; 
} 

यह आसान है क्योंकि यह परवाह नहीं करता है कि इनपुट कहां से आता है (फ़ाइल या stdin)।

पायथन में मैं इस

if len(sys.argv) == 2: # there's a command line argument 
    sys.stdin = file(sys.argv[1]) 
for line in sys.stdin.readlines(): 
    do stuff 

जो बहुत ही सुंदर प्रतीत नहीं होता है का उपयोग करें। क्या कोई पाइथन मुहावरे है जो आसानी से फ़ाइल/stdin इनपुट संभालती है?

import fileinput 

for line in fileinput.input(): ... 
+1

एक "पठनीय कोड" बिंदु दृश्य से, मैं आपके पायथन कोड को प्राथमिकता दूंगा क्योंकि अधिकांश लोग पर्ल के साथ काम नहीं कर रहे हैं, यह नहीं पता कि पर्ल कोड का क्या अर्थ है। – schnaader

+4

आप कम से कम छोड़ सकते हैं .readlines() – Jiri

+2

डुप्लिकेट: http://stackoverflow.com/questions/715277/how-do-i-iterate-over-all-lines-of-files-passed-on-the-commandline -इन-पायथन –

उत्तर

49

मानक पुस्तकालय में fileinput मॉड्यूल सिर्फ तुम क्या चाहते है अगर सूची खाली है।

+0

दरअसल। बहुत - बहुत धन्यवाद। क्षमा करें, मैंने दूसरे प्रश्न को याद किया जो एक ही समस्या से संबंधित है। इस पतंग के साथ खोजना मुश्किल था ... – Eisen

15
import fileinput 
for line in fileinput.input(): 
    process(line) 

sys.argv में सूचीबद्ध सभी फ़ाइलों की लाइनों पर यह दोहराता [1:], sys.stdin को दोषी

+0

मैं अन्य उद्देश्यों के लिए तर्क का उपयोग कर रहा हूं, क्या मैं उस व्यवहार को अक्षम कर सकता हूं? – user1552512

+0

@ user1552512 हां, https://docs.python.org/2/library/fileinput.html देखें: 'फ़ाइल नामों की एक वैकल्पिक सूची निर्दिष्ट करने के लिए, इसे इनपुट() के पहले तर्क के रूप में पास करें। एक फ़ाइल नाम भी अनुमति है। – clacke

7

fileinput stdin के लिए डिफ़ॉल्ट, तो यह थोड़ा और संक्षिप्त बना देगा।

यदि आप बहुत कमांड लाइन सामग्री करते हैं, हालांकि, यह piping hack बहुत साफ है।

+0

कि पायथन रेसिपी बहुत साफ है! धन्यवाद! – Bklyn

संबंधित मुद्दे