आप स्टडिन से कैसे पढ़ते हैं?


1470

मैं कुछ कोड गोल्फ चुनौतियों को करने की कोशिश कर रहा हूं , लेकिन इन सभी के लिए इनपुट की आवश्यकता होती है stdin। पायथन में मुझे वह कैसे मिलेगा?

जवाबों:


949

आप fileinputमॉड्यूल का उपयोग कर सकते हैं :

import fileinput

for line in fileinput.input():
    pass

fileinput कमांड-लाइन तर्कों में दिए गए फ़ाइल नामों के रूप में निर्दिष्ट इनपुट में सभी लाइनों के माध्यम से लूप होगा, या कोई तर्क नहीं दिए जाने पर मानक इनपुट।

नोट: lineएक अनुगामी newline शामिल होगा; इसे हटाने के लिएline.rstrip()


1
@BorislavStoilov और यह जवाब सही ढंग से सवाल का जवाब देता है: "या मानक इनपुट यदि कोई तर्क प्रदान नहीं किया जाता है"।
डाइटमार 16

1
प्रलेखन में कहा गया है कि यह स्टडबैक में आता है: "यह sys.argv [1:] में सूचीबद्ध सभी फाइलों की तर्ज पर प्रदर्शित होता है, यदि सूची खाली है तो sys.stdin में डिफ़ॉल्ट है। यदि फ़ाइल का नाम '' है", तो इसे भी बदल दिया जाता है। sys.stdin द्वारा। फ़ाइल नाम की वैकल्पिक सूची निर्दिष्ट करने के लिए, इसे इनपुट () के पहले तर्क के रूप में पास करें। एक एकल फ़ाइल नाम की भी अनुमति है। "
अरलो

721

इसे करने के कुछ तरीके हैं।

  • sys.stdinएक फाइल की तरह वस्तु है जिस पर आप फ़ंक्शंस कॉल कर सकते हैं readया readlinesयदि आप सब कुछ पढ़ना चाहते हैं या आप सब कुछ पढ़ना चाहते हैं और स्वचालित रूप से न्यूलाइन द्वारा विभाजित करना चाहते हैं। ( import sysइसके लिए आपको काम करने की आवश्यकता है ।)

  • यदि आप उपयोगकर्ता को इनपुट के लिए संकेत देना चाहते हैं , तो आप raw_inputPython 2.X, और केवल inputPython 3 में उपयोग कर सकते हैं ।

  • यदि आप वास्तव में केवल कमांड-लाइन विकल्प पढ़ना चाहते हैं, तो आप उन्हें sys.argv सूची के माध्यम से एक्सेस कर सकते हैं ।

पायथन में I / O पर आपको यह विकीबूक लेख संभवतः उपयोगी संदर्भ के रूप में मिलेगा ।


445
import sys

for line in sys.stdin:
    print(line)

ध्यान दें कि इसमें अंत में एक नया वर्ण शामिल होगा। अंत में newline को निकालने के लिए, line.rstrip()@brittohalloran के रूप में उपयोग करें ।


7
line.rstrip ('\ n'), अन्यथा यह सभी व्हाट्सएप को छोड़ देगा
avp

इस पद्धति का उपयोग करते हुए, इनपुट स्ट्रीम समाप्त होने पर हमें कैसे पता चलेगा? मैं अंतिम पंक्ति के लिए हर पंक्ति को स्वीकार करने के बाद अल्पविराम जोड़ना चाहता हूं ।
आदी

मुझे प्राप्त होता है: TypeError: 'FileWrapper' ऑब्जेक्ट चलने योग्य नहीं है।
डिएगो क्विरोज़

@av इस \r\nलाइन अंत के साथ सही ढंग से नहीं निपटेंगे
जोस

228

पायथन में भी अंतर्निहित कार्य input()और हैं raw_input()अंतर्निहित कार्यों के तहत पायथन प्रलेखन देखें ।

उदाहरण के लिए,

name = raw_input("Enter your name: ")   # Python 2.x

या

name = input("Enter your name: ")   # Python 3

7
यह एक पंक्ति पढ़ता है, जो वास्तव में ओपी के बारे में नहीं पूछा है। मैं इस प्रश्न की व्याख्या करता हूं कि "मैं ईओएफ तक एक खुली फ़ाइल हैंडल से लाइनों का एक गुच्छा कैसे पढ़ सकता हूं?"
ट्रिपलए

4
ओपी एक कीबोर्ड से इनपुट पढ़ने के लिए नहीं कह रहा है, वह स्टड से पढ़ने के लिए कह रहा है जो आमतौर पर प्रतियोगियों को एक स्थिति प्रदान करता है।
संतुष्ट करता है

यह वही है जो मुझे चाहिए, Google मुझे यहां लाया। दिलचस्प है कि मैं आरएफआईडी टैग, डेटाइम, डेटाबेस को कोड करने में कामयाब रहा, लेकिन उपयोगकर्ता से इनपुट पढ़ने के लिए कभी भी परेशान नहीं हुआ
घड़ी की कल

204

यहाँ लर्निंग पायथन से है :

import sys
data = sys.stdin.readlines()
print "Counted", len(data), "lines."

यूनिक्स पर, आप कुछ ऐसा करके इसका परीक्षण कर सकते हैं:

% cat countlines.py | python countlines.py 
Counted 3 lines.

विंडोज या डॉस पर, आप करेंगे:

C:\> type countlines.py | python countlines.py 
Counted 3 lines.

4
यहाँ पायथन में लाइनों को गिनने के लिए अधिक मेमोरी कुशल (और शायद तेज़) तरीका है print(sum(chunk.count('\n') for chunk in iter(partial(sys.stdin.read, 1 << 15), ''))):। देखेंwc-l.py
jfs

11
यहां का उपयोग catबेमानी है। यूनिक्स सिस्टम के लिए सही मंगलाचरण है python countlines.py < countlines.py
istepaniuk

12
उपयोगकर्ताओं को उपयोग करने के लिए निर्देशित करने में "लर्निंग पायथन" गलत है readlines()। फ़ाइल ऑब्जेक्ट्स को मेमोरी में सभी डेटा को भौतिक किए बिना अधिक से अधिक पुनरावृत्त करने का इरादा है।
हारून हॉल

118

आप पायथन में स्टड से कैसे पढ़ते हैं?

मैं कुछ कोड गोल्फ चुनौतियों को करने की कोशिश कर रहा हूं, लेकिन उन सभी को इनपुट को स्टड से लेने की आवश्यकता है। पायथन में मुझे वह कैसे मिलेगा?

आप उपयोग कर सकते हैं:

  • sys.stdin- एक फ़ाइल की तरह वस्तु - sys.stdin.read()सब कुछ पढ़ने के लिए कॉल करें ।
  • input(prompt)- इसे आउटपुट के लिए एक वैकल्पिक प्रॉम्प्ट पास करें, यह स्टड से पहली न्यूलाइन तक पढ़ता है, जो इसे स्ट्रिप्स करता है। आपको अधिक लाइनें प्राप्त करने के लिए इसे बार-बार करना होगा, इनपुट के अंत में यह EOFError बढ़ाता है। (शायद गोल्फ के लिए महान नहीं है।) पायथन 2 में, यह है rawinput(prompt)
  • open(0).read()- पायथन 3 में, अंतर्निहित फ़ंक्शन फ़ाइल डिस्क्रिप्टर (ऑपरेटिंग सिस्टम IO संसाधनों का प्रतिनिधित्व करने वाले पूर्णांक) को openस्वीकार करता है , और 0 का डिस्क्रिप्टर है । यह एक फ़ाइल जैसी वस्तु लौटाता है जैसे - शायद गोल्फ के लिए आपका सबसे अच्छा दांव। पायथन 2 में, यह है ।stdinsys.stdinio.open
  • open('/dev/stdin').read()- के समान open(0), पायथन 2 और 3 पर काम करता है, लेकिन विंडोज (या सिग्विन) पर भी नहीं।
  • fileinput.input()- sys.argv[1:]अगर या नहीं दिए गए हैं, या स्टड में सूचीबद्ध सभी फाइलों में लाइनों पर एक पुनरावृत्ति देता है । का उपयोग करें ''.join(fileinput.input())

दोनों sysऔर fileinputआयातित किया जाना चाहिए, क्रमशः, निश्चित रूप से।

sys.stdinपायथन 2 और 3, विंडोज, यूनिक्स के साथ संगत त्वरित उदाहरण

तुम बस करने की जरूरत readसे sys.stdinअगर आप पाइप डेटा stdin के लिए, उदाहरण के लिए:

$ echo foo | python -c "import sys; print(sys.stdin.read())"
foo

हम यह देख सकते हैं कि sys.stdinडिफ़ॉल्ट पाठ मोड में है:

>>> import sys
>>> sys.stdin
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>

फ़ाइल उदाहरण

कहो कि आपके पास एक फ़ाइल है, inputs.txtहम उस फ़ाइल को स्वीकार कर सकते हैं और उसे वापस लिख सकते हैं:

python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt

लंबा जवाब

यहां दो विधियों, बिल्टिन फ़ंक्शन, input( raw_inputपायथन 2 में उपयोग ), और का उपयोग करते हुए एक पूर्ण, आसानी से नकल करने योग्य डेमो है , और sys.stdin। डेटा unmodified है, इसलिए प्रसंस्करण एक गैर-संचालन है।

शुरुआत करने के लिए, चलिए इनपुट्स के लिए एक फाइल बनाते हैं:

$ python -c "print('foo\nbar\nbaz')" > inputs.txt

और हमारे द्वारा पहले से देखे गए कोड का उपयोग करके, हम जाँच सकते हैं कि हमने फ़ाइल बनाई है:

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt 
foo
bar
baz

यहाँ sys.stdin.readअजगर 3 से मदद मिल रही है:

read(size=-1, /) method of _io.TextIOWrapper instance
    Read at most n characters from stream.

    Read from underlying buffer until we have n characters or we hit EOF.
    If n is negative or omitted, read until EOF.

बिलियन फ़ंक्शन, input( raw_inputपायथन 2 में)

अंतर्निहित फ़ंक्शन inputमानक इनपुट से एक नई लाइन तक पढ़ता है, जिसे छीन लिया जाता है (पूरक होता है print, जो डिफ़ॉल्ट रूप से एक नई पंक्ति जोड़ता है।) यह तब तक होता है जब तक कि यह ईओएफ (फ़ाइल का अंत) नहीं हो जाता है, जिस बिंदु पर यह उठता है EOFError

इस प्रकार, यहां बताया गया है कि आप स्टैडन से पढ़ने के लिए inputपायथन 3 (या raw_inputपायथन 2 में) का उपयोग कैसे कर सकते हैं - इसलिए हम एक पायथन मॉड्यूल बनाते हैं जिसे हम stdindemo.py कहते हैं:

$ python -c "print('try:\n    while True:\n        print(input())\nexcept EOFError:\n    pass')" > stdindemo.py 

और हम यह सुनिश्चित करने के लिए इसे वापस प्रिंट करते हैं, जैसा कि हम उम्मीद करते हैं:

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < stdindemo.py 
try:
    while True:
        print(input())
except EOFError:
    pass

फिर से, inputतब तक पढ़ता है जब तक कि नई लाइन और अनिवार्य रूप से लाइन से छीन नहीं लेता। printएक नई पंक्ति जोड़ता है। इसलिए जब वे दोनों इनपुट को संशोधित करते हैं, तो उनके संशोधन रद्द हो जाते हैं। (इसलिए वे अनिवार्य रूप से एक दूसरे के पूरक हैं।)

और जब inputअंत-फ़ाइल का चरित्र मिलता है, तो यह EOFError को उठाता है, जिसे हम अनदेखा करते हैं और फिर प्रोग्राम से बाहर निकलते हैं।

और लिनक्स / यूनिक्स पर, हम बिल्ली से पाइप कर सकते हैं:

$ cat inputs.txt | python -m stdindemo
foo
bar
baz

या हम सिर्फ फ़ाइल को स्टड से पुनर्निर्देशित कर सकते हैं:

$ python -m stdindemo < inputs.txt 
foo
bar
baz

हम मॉड्यूल को स्क्रिप्ट के रूप में भी निष्पादित कर सकते हैं:

$ python stdindemo.py < inputs.txt 
foo
bar
baz

यहां inputपाइथन 3 से बिलिन की मदद ली गई है :

input(prompt=None, /)
    Read a string from standard input.  The trailing newline is stripped.

    The prompt string, if given, is printed to standard output without a
    trailing newline before reading input.

    If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
    On *nix systems, readline is used if available.

sys.stdin

यहाँ हम एक डेमो स्क्रिप्ट का उपयोग करते हैं sys.stdin। फ़ाइल की तरह ऑब्जेक्ट पर पुनरावृति करने के लिए कुशल तरीका फ़ाइल-ऑब्जेक्ट के रूप में उपयोग करने के लिए है। इस इनपुट से stdout लिखने के लिए पूरक विधि को बस उपयोग करना है sys.stdout.write:

$ python -c "print('import sys\nfor line in sys.stdin:\n    sys.stdout.write(line)')" > stdindemo2.py

यह सुनिश्चित करने के लिए इसे वापस प्रिंट करें कि यह सही दिखता है:

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < stdindemo2.py 
import sys
for line in sys.stdin:
    sys.stdout.write(line)

और इनपुट को फ़ाइल में पुनर्निर्देशित करना:

$ python -m stdindemo2 < inputs.txt
foo
bar
baz

एक कमांड में गोल्फ:

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt
foo
bar
baz

गोल्फिंग के लिए फाइल डिस्क्रिप्टर्स

चूंकि फाइल डिस्क्रिप्टर के लिए stdinऔर stdoutक्रमशः 0 और 1 हैं, हम उन openपायथन 3 (नॉट 2, और ध्यान दें कि हमें अभी भी stdout लिखने के लिए 'w' की आवश्यकता है) पास कर सकते हैं।

यदि यह आपके सिस्टम पर काम करता है, तो यह अधिक वर्णों को बंद कर देगा।

$ python -c "open(1,'w').write(open(0).read())" < inputs.txt
baz
bar
foo

अजगर 2 भी io.openऐसा करता है, लेकिन आयात में बहुत अधिक स्थान है:

$ python -c "from io import open; open(1,'w').write(open(0).read())" < inputs.txt 
foo
bar
baz

अन्य टिप्पणियों और उत्तरों को संबोधित करना

एक टिप्पणी ''.join(sys.stdin)गोल्फिंग के लिए सुझाती है लेकिन यह वास्तव में sys.stdin.read () से अधिक लंबी है - प्लस पायथन को मेमोरी में एक अतिरिक्त सूची बनानी चाहिए (यह str.joinतब काम करता है जब सूची नहीं दी गई हो) - इसके विपरीत:

''.join(sys.stdin)
sys.stdin.read()

शीर्ष उत्तर बताता है:

import fileinput

for line in fileinput.input():
    pass

लेकिन, चूंकि sys.stdinफ़ाइल एपीआई, इटरेटर प्रोटोकॉल सहित लागू करता है, इसलिए यह केवल इस प्रकार है:

import sys

for line in sys.stdin:
    pass

एक अन्य जवाब यह सुझाव देता है। बस याद रखें कि यदि आप एक दुभाषिया में करते हैं, तो आपको करने की आवश्यकता होगी Ctrl- dयदि आप लिनक्स या मैक पर हैं, या Ctrl- प्रक्रिया के अंत-में-फ़ाइल चरित्र भेजने के लिए zविंडोज (बाद में Enter) पर। इसके अलावा, वह उत्तर बताता है print(line)- जो '\n'कि अंत में जोड़ता है - print(line, end='')इसके बजाय उपयोग करें (यदि पायथन 2 में, आपको आवश्यकता होगी from __future__ import print_function)।

के लिए वास्तविक उपयोग मामला fileinputफाइलों की एक श्रृंखला में पढ़ने के लिए है।


103

दूसरों द्वारा प्रस्तावित उत्तर:

for line in sys.stdin:
  print line

बहुत सरल और पाइथोनिक है, लेकिन यह ध्यान दिया जाना चाहिए कि इनपुट की तर्ज पर पुनरावृति शुरू करने से पहले स्क्रिप्ट ईओएफ तक इंतजार करेगी।

इसका मतलब है कि tail -f error_log | myscript.pyउम्मीद के मुताबिक लाइनों को संसाधित नहीं किया जाएगा।

ऐसे उपयोग के मामले की सही स्क्रिप्ट होगी:

while 1:
    try:
        line = sys.stdin.readline()
    except KeyboardInterrupt:
        break

    if not line:
        break

    print line

अद्यतन
टिप्पणी से यह स्पष्ट हो गया है कि अजगर 2 पर केवल बफरिंग शामिल हो सकती है, ताकि आप प्रिंट कॉल जारी होने से पहले या ईओएफ भरने के लिए बफर का इंतजार कर सकें।


8
for line in sys.stdin:पैटर्न नहीं है EOF के लिए प्रतीक्षा करें। लेकिन अगर आप बहुत छोटी फाइलों पर परीक्षण करते हैं, तो प्रतिक्रियाएं बफर हो सकती हैं। यह देखने के लिए अधिक डेटा के साथ परीक्षण करें कि यह मध्यवर्ती परिणाम पढ़ता है।
एम.बी.

जब मुझे अजगर 2.6.6 का उपयोग करते समय स्ट्रीम से इनपुट लेते समय एंड ऑफ़ फाइल या बफरिंग का इंतज़ार होता है, लेकिन 3.1.3 के साथ मैं नहीं। नोट print line3.1.3 में नहीं जागता है, लेकिन print(line)करता है।
ctrl-alt-delor-

मेरे अजगर 2.7.5 "sys.stdin में लाइन के लिए", EOF तक के ब्लॉक या कुछ उचित मात्रा में डेटा बफ़र किए गए हैं। स्ट्रीम प्रोसेसिंग के लिए ठीक है। लाइन प्रोसेसिंग या उपयोगकर्ता इनपुट द्वारा लाइन के लिए ठीक नहीं है।
शॉन

2
मुझे संदेह है कि यह लिबास में ट्टी का पता लगाने से संबंधित है, इसलिए जब आप इसे इंटरेक्टिव शेल पर पता लगाते हैं तो यह किसी भी प्रकार से ट्टी का पता नहीं लगाता है, उम्मीद-देव से असहमत होना एक उपयोगी उपयोग है जो मेरा मानना ​​है कि ld_cload के माध्यम से एक शिम इंजेक्ट करता है इसलिए is_atty रिटर्न सही है (I संदेह है कि यह इसे कैसे सौंप रहा है)
Métt Frëëman

8
@ सीन: गलतfor line in sys.stdin:"EOF तक ब्लॉक नहीं करता"। पाइथन 2 में एक रीड-फॉरवर्ड बग है जो कि इसी बफ़र के पूर्ण होने तक लाइनों को विलंबित करता है। यह एक बफ़रिंग समस्या है जो EOF से संबंधित नहीं है। वर्कअराउंड करने के लिए, उपयोग for line in iter(sys.stdin.readline, ''):( io.open()साधारण फ़ाइलों के लिए उपयोग )। आपको इसकी आवश्यकता नहीं है पायथन 3.
jfs

39

यह मानक आउटपुट के लिए मानक इनपुट को प्रतिध्वनित करेगा:

import sys
line = sys.stdin.readline()
while line:
    print line,
    line = sys.stdin.readline()

31

का उपयोग कर सभी awers पर निर्माण sys.stdin, आप एक तर्क फ़ाइल से पढ़ने के लिए निम्न की तरह कुछ भी कर सकते हैं यदि कम से कम एक तर्क मौजूद है, और अन्यथा स्टड पर वापस गिरें:

import sys
f = open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin    
for line in f:
#     Do your stuff

और इसे भी उपयोग करें

$ python do-my-stuff.py infile.txt

या

$ cat infile.txt | python do-my-stuff.py

या और भी

$ python do-my-stuff.py < infile.txt

यह आपके पाइथन लिपि को कई GNU / Unix प्रोग्राम जैसे cat, grepऔर sed


17

argparse एक आसान उपाय है

उदाहरण पायथन 2 और 3 दोनों संस्करणों के साथ संगत:

#!/usr/bin/python

import argparse
import sys

parser = argparse.ArgumentParser()

parser.add_argument('infile',
                    default=sys.stdin,
                    type=argparse.FileType('r'),
                    nargs='?')

args = parser.parse_args()

data = args.infile.read()

आप इस स्क्रिप्ट को कई तरीकों से चला सकते हैं:

1. उपयोग करना stdin

echo 'foo bar' | ./above-script.py

  या यहाँ स्ट्रिंग द्वारा प्रतिस्थापित echoकरके कम :

./above-script.py <<< 'foo bar'

2. फ़ाइल नाम तर्क का उपयोग करना

echo 'foo bar' > my-file.data
./above-script.py my-file.data

3. stdinविशेष फ़ाइल नाम के माध्यम से उपयोग करना-

echo 'foo bar' | ./above-script.py -

यहाँ पर एक जवाब है कि क्या करना है, अगर इनपुट फ़ाइल संकुचित है: stackoverflow.com/a/33621549/778533 एक भी कर सकते हैं add_argument('--in'और फिर स्क्रिप्ट पर पाइप करें और --in -कमांड लाइन में जोड़ें । inचर / विशेषता के लिए PS एक बहुत अच्छा नाम नहीं है।
tommy.carstensen

inएक चर के लिए सिर्फ एक बुरा नाम नहीं है, यह अवैध है। आरक्षित कीवर्ड के args.in.read()कारण InvalidSyntax त्रुटि को बढ़ाएगा in। बस infileअजगर का नाम बदलकर डॉक्स करने के लिए नाम बदल सकते हैं: docs.python.org/3/library/…
Ken Colton

आपकी प्रतिक्रिया के लिए धन्यवाद @ toyy.carstensen, मैंने अभी उत्तर में सुधार किया है। मेरी क्रिसमस और नया साल मुबारक; ;-)
'21:

14

कोड की निम्नलिखित चिप आपकी मदद करेगी (यह EOFएक स्ट्रिंग में, सभी स्टड को अवरुद्ध करना पढ़ेगी ):

import sys
input_str = sys.stdin.read()
print input_str.split()

8

मैं बहुत चकित हूं कि किसी ने भी अब तक इस हैक का उल्लेख नहीं किया है:

python -c "import sys; set(map(sys.stdout.write,sys.stdin))"

python2 में आप set()कॉल ड्रॉप कर सकते हैं , लेकिन यह किसी भी तरह से शब्द करेगा


1
readlinesउस विभाजन का उपयोग लाइनों में और फिर joinसे क्यों करें? आप सिर्फ लिख सकते हैंprint(sys.stdin.read())
musiphil

यह आवश्यकता से अधिक मेमोरी का उपयोग करेगा क्योंकि अजगर को एक अतिरिक्त सरणी बनाने की आवश्यकता है।
हैरी मोरेनो

खैर, वास्तव में नहीं, क्योंकि writeरिटर्न None, और सेट का आकार 1 से अधिक कभी नहीं होगा ( =len(set([None])))
उरी गोरेन

7

इसे इस्तेमाल करे:

import sys

print sys.stdin.read().upper()

और इसकी जांच करें:

$ echo "Hello World" | python myFile.py

7

आप स्टडिन से पढ़ सकते हैं और फिर इनपुट को "डेटा" में निम्नानुसार स्टोर कर सकते हैं :

data = ""
for line in sys.stdin:
    data += line


एक ही चीज के साथ किया जा सकता है data = sys.stdin.read(), बार-बार स्ट्रिंग कंक्रीटिंग की समस्या के बिना।
मुसीफिल

6

से पढ़ें sys.stdin, लेकिन विंडोज पर द्विआधारी डेटा पढ़ने के लिए , आपको अतिरिक्त सावधानी बरतने की आवश्यकता है, क्योंकि sys.stdinपाठ मोड में खोला गया है और यह आपके \r\nसाथ की जगह को भ्रष्ट करेगा \n

समाधान बाइनरी में मोड सेट करने के लिए है यदि विंडोज + पायथन 2 का पता चला है, और पायथन 3 उपयोग पर sys.stdin.buffer

import sys

PY3K = sys.version_info >= (3, 0)

if PY3K:
    source = sys.stdin.buffer
else:
    # Python 2 on Windows opens sys.stdin in text mode, and
    # binary data that read from it becomes corrupted on \r\n
    if sys.platform == "win32":
        # set sys.stdin to binary mode
        import os, msvcrt
        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    source = sys.stdin

b = source.read()

4

मैं निम्नलिखित विधि का उपयोग करता हूं, यह स्टड से एक स्ट्रिंग लौटाता है (मैं इसे जसन पार्सिंग के लिए उपयोग करता हूं)। यह विंडोज पर पाइप और प्रॉम्प्ट के साथ काम करता है (अभी तक लिनक्स पर परीक्षण नहीं किया गया है)। जब संकेत देते हैं, तो दो पंक्ति विराम इनपुट के अंत का संकेत देते हैं।

def get_from_stdin():

  lb = 0
  stdin = ''

  for line in sys.stdin:
    if line == "\n":
        lb += 1
        if lb == 2:
            break
    else:
        lb = 0
        stdin += line

  return stdin

3

समस्या मेरे पास समाधान के साथ है

import sys

for line in sys.stdin:
    print(line)

यह है कि यदि आप किसी डेटा को स्टड करने के लिए पास नहीं करते हैं, तो यह हमेशा के लिए ब्लॉक हो जाएगा। इसलिए मुझे यह जवाब पसंद है : अगर पहले स्टड पर कुछ डेटा है, तो जांच करें और फिर पढ़ें। यह वही है जो मैंने किया:

import sys
import select

# select(files to read from, files to write to, magic, timeout)
# timeout=0.0 is essential b/c we want to know the asnwer right away
if select.select([sys.stdin], [], [], 0.0)[0]:
    help_file_fragment = sys.stdin.read()
else:
    print("No data passed to stdin", file=sys.stderr)
    sys.exit(2)

मैं गंभीरता से अगर इस विधि में एक शर्त छिपाने की सलाह देते हैं।
४११ तक टिक्तक

1
यह विधि प्रोग्राम की प्रयोज्यता को गंभीरता से सीमित करती है: उदाहरण के लिए, आप टर्मिनल से इंटरेक्टिव इनपुट के लिए इसका उपयोग नहीं कर सकते, क्योंकि जब selectकॉल किया जाता है तो इनपुट लगभग "तैयार" नहीं होगा ; या अगर आप एक धीमी माध्यम (नेटवर्क, सीडी, टेप, आदि) पर स्टड एक फ़ाइल से जुड़ा हुआ है तो भी आपको समस्याओं का सामना करना पड़ सकता है। आपने कहा था कि "यदि आप किसी भी डेटा को स्टड करने के लिए पास नहीं करते हैं, तो यह हमेशा के लिए अवरुद्ध हो जाएगा।" एक समस्या है , लेकिन मैं कहूंगा कि यह एक विशेषता है । अधिकांश सीएलआई कार्यक्रम (जैसे cat) इस तरह से काम करते हैं, और उनसे उम्मीद की जाती है। EOF केवल एक चीज है जिस पर आपको इनपुट के अंत का पता लगाने के लिए निर्भर होना चाहिए।
मुसीफिल

2

मुझे कुछ समस्याएँ थीं जब इस पर काम करने के लिए पर्चियों पर पढ़ने के लिए मिलता था। जब सॉकेट बंद हो गया तो वह सक्रिय लूप में खाली स्ट्रिंग लौटाने लगा। तो यह मेरा समाधान है (जो मैंने केवल लिनक्स में परीक्षण किया है, लेकिन आशा है कि यह अन्य सभी प्रणालियों में काम करता है)

import sys, os
sep=os.linesep

while sep == os.linesep:
    data = sys.stdin.readline()               
    sep = data[-len(os.linesep):]
    print '> "%s"' % data.strip()

तो अगर आप एक सॉकेट पर सुनना शुरू करते हैं तो यह ठीक से काम करेगा (जैसे bash में):

while :; do nc -l 12345 | python test.py ; done

और आप इसे टेलनेट के साथ कॉल कर सकते हैं या बस एक ब्राउज़र को लोकलहोस्ट पर इंगित कर सकते हैं: 12345


1

इसके बारे में:

for line in sys.stdin:

मैंने इसे बहुत बड़ी फ़ाइल के लिए अजगर 2.7 (किसी और के सुझाव के बाद) पर आज़माया, और मैं इसकी अनुशंसा नहीं करता, ठीक ऊपर बताए गए कारणों के लिए (कुछ भी लंबे समय तक नहीं होता है)।

मैं थोड़ा अधिक पायथोनिक समाधान के साथ समाप्त हुआ (और यह बड़ी फ़ाइलों पर काम करता है):

with open(sys.argv[1], 'r') as f:
    for line in f:

तब मैं स्क्रिप्ट को स्थानीय रूप से चला सकता हूं:

python myscript.py "0 1 2 3 4..." # can be a multi-line string or filename - any std.in input will work

फ़ाइल खोलना स्टड से नहीं पढ़ रहा है, जैसे सवाल पूछता है। -1
हारून हॉल

इस मामले में मैं sys.stdinस्क्रिप्ट के लिए एक कमांड-लाइन तर्क के रूप में पारित कर रहा हूं ।
szeitlin

1
आप sys.stdinस्क्रिप्ट पर कमांड-लाइन तर्क के रूप में कैसे पास कर सकते हैं ? तर्क तार हैं और धाराएं फ़ाइल की तरह की वस्तुएं हैं, वे समान नहीं हैं।
डेफ़ाज़र

@DeFazer ने इसका उपयोग करने का तरीका दिखाने के लिए संपादन किया। तर्क तार हैं, हाँ, लेकिन जैसा कि अजगर डॉक्स और मैंने ऊपर एक पूर्व टिप्पणी में उल्लेख किया है, sys.stdinएक फ़ाइल की तरह वस्तु है
szeitlin

1

के लिए अजगर 3 हो सकता है कि:

# Filename e.g. cat.py
import sys

for line in sys.stdin:
    print(line, end="")

यह मूल रूप से बिल्ली (1) का एक सरल रूप है, क्योंकि यह प्रत्येक पंक्ति के बाद एक नई रेखा नहीं जोड़ता है। आप इसका उपयोग कर सकते हैं (आपके द्वारा फ़ाइल निष्पादन योग्य चिह्नित करने के बाद chmod +x cat.pyजैसे कि:

echo Hello | ./cat.py

0

वहाँ है os.read(0, x) जो 0 से xbytes पढ़ता है जो स्टड का प्रतिनिधित्व करता है। यह बिना पढ़े, sys.stdin.read () की तुलना में अधिक निम्न स्तर है


0

-cकमांड का उपयोग करते समय , एक ट्रिकी तरीके के रूप में, stdin(और कुछ मामलों में अधिक लचीला) पढ़ने के बजाय, आप $साइन द्वारा शुरू किए गए कोष्ठक के भीतर उद्धरणों में बेचने की कमान डालकर एक शेल स्क्रिप्ट कमांड के साथ-साथ अपने अजगर कमांड को पास कर सकते हैं ।

जैसे

python3 -c "import sys; print(len(sys.argv[1].split('\n')))" "$(cat ~/.goldendict/history)"

यह गोल्डेंडिक्ट के इतिहास फ़ाइल से लाइनों की संख्या की गणना करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.