python आप पायथन में stdin से कैसे पढ़ते हैं?




(16)

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

यदि विंडोज + पायथन 2 का पता चला है, और पायथन 3 पर sys.stdin.buffer उपयोग करें, तो समाधान मोड को बाइनरी पर सेट 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()

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


Sys.stdin का उपयोग करके सभी एवरों पर बिल्डिंग, यदि आप कम से कम एक तर्क मौजूद हैं, तो आप तर्क फ़ाइल से पढ़ने के लिए निम्न की तरह कुछ भी कर सकते हैं, और अन्यथा 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

इससे आपकी पाइथन लिपि कई जीएनयू / यूनिक्स प्रोग्राम जैसे cat , grep और sed तरह व्यवहार करेगी।


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

import sys

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

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

$ echo "Hello World" | python myFile.py

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

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

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

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

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


एक विकल्प नीचे दिखाए गए इनपुट फ़ंक्शन का उपयोग करना है। यदि आप डेटा प्रकार के बारे में निश्चित नहीं हैं तो raw_input विधि भी है।

#!/usr/bin/env python

number = input("Please enter a number : ")
print("Entered number is %d" % number)

कार्यक्रम चला रहा है:

python test1.py

Please enter a number : 55
Entered number is 55

संदर्भ: http://www.python-course.eu/input.php


n = int(raw_input())
for i in xrange(n):
    name, number = raw_input().split()

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

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

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

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

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

import sys, os
sep=os.linesep

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

तो यदि आप सॉकेट पर सुनना शुरू करते हैं तो यह ठीक से काम करेगा (उदाहरण के लिए बैश में):

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

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


पायथन में अंतर्निहित फ़ंक्शन input() और raw_input()बिल्ट-इन फ़ंक्शंस के तहत पाइथन दस्तावेज़ देखें।

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

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

या

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

import sys

for line in sys.stdin:
    print line

यह मानक आउटपुट में मानक इनपुट गूंज जाएगा:

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

इस से सम्बन्धित:

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

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

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.

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

import fileinput

for line in fileinput.input():
    pass

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


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

import sys

for line in sys.stdin:
    print(line)

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

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)




stdin