আপনি স্টিডিন থেকে কিভাবে পড়বেন?


1469

আমি কোড গল্ফ চ্যালেঞ্জগুলির কয়েকটি করার চেষ্টা করছি , তবে তাদের সকলের ইনপুট নেওয়া দরকার stdin। পাইথনে আমি কীভাবে এটি পাব?

উত্তর:


948

আপনি fileinputমডিউলটি ব্যবহার করতে পারেন :

import fileinput

for line in fileinput.input():
    pass

fileinput কমান্ড-লাইন আর্গুমেন্টে দেওয়া ফাইলের নাম হিসাবে নির্দিষ্ট ইনপুটটিতে সমস্ত লাইন লুপ করবে, বা কোনও আর্গুমেন্ট সরবরাহ না করা থাকলে স্ট্যান্ডার্ড ইনপুট।

দ্রষ্টব্য: lineএতে একটি পিছনের নিউলাইন থাকবে; এটি ব্যবহার অপসারণline.rstrip()


1
@ বোরিস্লাভসটোইলোভ এবং এই উত্তরটি সঠিকভাবে প্রশ্নের উত্তর দেয়: "বা কোনও যুক্তি সরবরাহ না করা থাকলে স্ট্যান্ডার্ড ইনপুট"।
ডায়েটমার

ডকুমেন্টেশন বলে যে এটি স্টিডিনের কাছে পতিত হয়েছে: "তালিকাটি খালি থাকলে সিএস.স্টদিনে ডিফল্ট হয়ে sys.argv [1:] এ তালিকাভুক্ত সমস্ত ফাইলের রেখার উপর দিয়ে এটি পুনরুক্ত হয়। যদি কোনও ফাইলের নাম '-' থাকে, তবে এটি প্রতিস্থাপন করা হয় ফাইল নামগুলির বিকল্প তালিকা নির্দিষ্ট করতে, ইনপুট () এর প্রথম যুক্তি হিসাবে এটি পাস করুন A একক ফাইলের নামও অনুমোদিত allowed "
আরলো

721

এটি করার কয়েকটি উপায় রয়েছে।

  • sys.stdinএকটি ফাইলের মতো বস্তু যার উপর আপনি ফাংশনগুলি কল করতে পারেন readবা readlinesআপনি যদি সমস্ত কিছু পড়তে চান বা আপনি সবকিছু পড়তে চান এবং স্বয়ংক্রিয়ভাবে নতুন লাইনে বিভক্ত হন। ( import sysএটি কাজ করার জন্য আপনার প্রয়োজন ))

  • আপনি যদি ইনপুটটির জন্য ব্যবহারকারীকে প্রম্পট করতে চান , আপনি raw_inputপাইথন ২. এক্স এবং কেবল inputপাইথন 3 এ ব্যবহার করতে পারেন ।

  • আপনি যদি কেবল কমান্ড-লাইন বিকল্পগুলি পড়তে চান তবে আপনি সেগুলি sys.argv তালিকার মাধ্যমে অ্যাক্সেস করতে পারেন ।

আপনি সম্ভবত পাইথনের আই / ও-তে এই উইকিবুক নিবন্ধটি একটি দরকারী রেফারেন্স হিসাবে দেখতে পাবেন।


445
import sys

for line in sys.stdin:
    print(line)

নোট করুন যে এর শেষে একটি নতুনলাইন চরিত্র অন্তর্ভুক্ত থাকবে। শেষের দিকে line.rstrip()নিউলাইনটি সরাতে, @ ব্রিতোহালোরান যেমন বলেছিলেন তেমন ব্যবহার করুন ।


7
লাইন.স্ট্রিপ ('\ n'), অন্যথায় এটি সমস্ত
শ্বেত

এই পদ্ধতিটি ব্যবহার করে, ইনপুট স্ট্রিমটি কখন শেষ হবে তা আমরা কীভাবে জানব? আমি প্রতি লাইন পর কমা যোগ করতে চান excepts শেষ লাইনটি জন্য।
আসক্ত

আমি পেয়েছি: TypeError: 'FileWrapper' অবজেক্টটি পুনরাবৃত্তিযোগ্য নয়।
দিয়েগো কুইরোজ

@Avp এটি \r\nলাইন শেষের সাথে সঠিকভাবে মোকাবেলা করবে না
জোসচ

228

পাইথনের বিল্ট-ইন ফাংশন রয়েছে input()এবং raw_input()বিল্ট-ইন ফাংশনগুলির অধীনে পাইথন ডকুমেন্টেশন দেখুন ।

উদাহরণ স্বরূপ,

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

অথবা

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

7
এটি একটি একক লাইন পড়ে, যা আসলে ওপি সম্পর্কে জিজ্ঞাসা করে না। আমি এই প্রশ্নের ব্যাখ্যা দিয়েছিলাম "ইওএফ না হওয়া পর্যন্ত আমি কীভাবে একটি উন্মুক্ত ফাইল হ্যান্ডেল থেকে একগুচ্ছ রেখাগুলি পড়ব?"
ট্রিপলি

4
ওপি একটি কীবোর্ড থেকে ইনপুট পড়তে বলছে না, তিনি স্টিডিনের কাছ থেকে পড়তে বলছেন যা প্রতিযোগিতার পরিস্থিতিতে সাধারণত প্রতিযোগীদের দেওয়া হয়।
ক্রিসফস

এটি আমার প্রয়োজন, গুগল আমাকে এখানে এনেছে। মজার বিষয় হল আমি
আরএফআইডি ট্যাগস, ডেটটাইম

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)- এটি আউটপুটে anচ্ছিক প্রম্পটটি পাস করুন, এটি স্টিডিন থেকে শুরু করে প্রথম নিউলাইন পর্যন্ত পড়ে, যা এটি স্ট্রিপ করে। আরও লাইন পেতে আপনাকে বারবার এটি করতে হবে, ইনপুট শেষে এটি ইওফেরার উত্থাপন করে। (সম্ভবত গল্ফিংয়ের জন্য দুর্দান্ত নয়)) পাইথন 2 এ এটি rawinput(prompt)
  • open(0).read()- পাইথন 3-এ, বিল্টিন ফাংশন ফাইল বর্ণনাকারীopen গ্রহণ করে (অপারেটিং সিস্টেম IO সংস্থানসমূহ উপস্থাপন করে পূর্ণসংখ্যা), এবং 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। ডেটা অপরিবর্তিত, সুতরাং প্রক্রিয়াজাতকরণ একটি অপারেশন।

শুরু করার জন্য, আসুন ইনপুটগুলির জন্য একটি ফাইল তৈরি করুন:

$ 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 এ)

Builtin ফাংশন inputএকটি newline, যা ছিনতাই হয় পর্যন্ত স্ট্যান্ডার্ড ইনপুট থেকে সার্চ (complementing print, যা ডিফল্টভাবে একটি newline যোগ করা হয়েছে।) পর্যন্ত এটি ফাইলের শেষে (ফাইলের শেষে) পায় যা এ উত্থাপন বাতলান, এই ঘটে EOFError

সুতরাং, আপনি স্টিডিন থেকে পড়তে inputপাইথন 3 (বা raw_inputপাইথন 2 এ) কীভাবে ব্যবহার করতে পারেন তা এখানে রয়েছে - সুতরাং আমরা একটি পাইথন মডিউল তৈরি করি যাকে আমরা স্ট্যান্ডিনডেমো.পি কল করি:

$ 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নতুন লাইন হওয়া পর্যন্ত পড়া এবং মূলত এটি লাইন থেকে সরিয়ে নেওয়া ps printএকটি নতুন লাইন যুক্ত। সুতরাং তারা উভয় ইনপুট পরিবর্তন করার সময়, তাদের পরিবর্তনগুলি বাতিল করে cancel (সুতরাং তারা মূলত একে অপরের পরিপূরক))

এবং যখন inputফাইলের শেষের অক্ষরটি পায়, এটি ইওফেরর উত্থাপন করে, যা আমরা উপেক্ষা করে প্রোগ্রামটি থেকে বেরিয়ে আসি।

এবং লিনাক্স / ইউনিক্সে, আমরা বিড়াল থেকে পাইপ করতে পারি:

$ 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- zWindows এ (পরে 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:প্যাটার্ন নেই ফাইলের শেষে জন্য অপেক্ষা করুন। আপনি যদি খুব ছোট ফাইলগুলিতে পরীক্ষা করেন তবে প্রতিক্রিয়াগুলি বাফার হতে পারে। এটি মধ্যবর্তী ফলাফলগুলি পড়ে তা দেখতে আরও ডেটা দিয়ে পরীক্ষা করুন।
এমবি

পাইথন ২.6..6 ব্যবহার করার সময় কোনও স্ট্রিম থেকে ইনপুট নেওয়ার সময় আমি ফাইল অফ বা ফাইলিংয়ের জন্য অপেক্ষা করি, তবে ৩.১.৩ সহ আমি পাই না। নোটটি print line3.1.3 এ জেগে ওঠে না, তবে print(line)তা করে।
ctrl-alt-delor

আমার অজগর ২.7.৫ "সাইস্ট.স্টদিনে লাইনের জন্য", ইওএফ অবধি ব্লক বা কিছু যুক্তিসঙ্গত পরিমাণ ডেটা বাফার করেছে। স্ট্রিম প্রসেসিংয়ের জন্য দুর্দান্ত। লাইন প্রসেসিং বা ব্যবহারকারীর ইনপুট দ্বারা লাইনের জন্য ঠিক নয়।
শন

2
আমি সন্দেহ করি এটি লিবিসি তে টিটি সনাক্তকরণের সাথে সম্পর্কিত, সুতরাং আপনি পাইপ করার সময় এটি একটি ইন্টারেক্টিভ শেলটিতে সনাক্ত করেন এটি কোনও টিটি সনাক্ত করে না, প্রত্যাশা-দেব থেকে আনফার একটি সহজ ব্যবহার যা আমি বিশ্বাস করি যে এলডি_প্রিলোডের মাধ্যমে একটি শিমকে ইনজেকশন দেয় তাই IS_atty সত্য ফিরে আসে (I সন্দেহ করুন যে এটি কীভাবে এটি হস্তান্তর করছে)
ম্যাট ফ্রম্যান

8
@Sean: ভুলfor line in sys.stdin:"ইওএফ অবধি" অবরুদ্ধ করে না। পাইথন 2 এ একটি রিড-ফরোড বাগ রয়েছে যা সংশ্লিষ্ট বাফারটি পূর্ণ না হওয়া পর্যন্ত লাইনগুলিকে বিলম্ব করে। এটি একটি বাফারিং ইস্যু যা ইওএফ সম্পর্কিত নয়। কার্যক্ষমতার জন্য, ব্যবহার করুন 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

সমস্ত আঞ্জর ব্যবহার করে বিল্ডিং করা 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

যে যেমন অনেক গনুহ / ইউনিক্স প্রোগ্রাম মত আপনার পাইথন স্ক্রিপ্ট আচরণ করবে 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'

২. একটি ফাইল নাম যুক্তি ব্যবহার করে

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

৩. stdinবিশেষ ফাইলের নাম ব্যবহার করে-

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

এখানে কী করা উচিত তার একটি উত্তর দেওয়া হয়েছে, যদি ইনপুট ফাইলটি সংকুচিত করা হয়: stackoverflow.com/a/33621549/778533 যে কেউ করতে পারে add_argument('--in'এবং তারপরে স্ক্রিপ্টে পাইপ --in -করে কমান্ড লাইনে যুক্ত করতে পারে। inভেরিয়েবল / বৈশিষ্ট্যের জন্য পিএস খুব ভাল নাম নয় good
tommy.carstensen

inচলকটির জন্য কেবল একটি খারাপ নাম নয়, এটি অবৈধ। সংরক্ষিত কীওয়ার্ডের args.in.read()কারণে অবৈধ সংশ্লেষ ত্রুটি বাড়িয়ে তুলবে ininfileপাইথন আরগপারস ডক্সের মতো করে কেবল নামকরণ করতে পারেন: ডকস.পিথোন.আর
কেন কল্টন

আপনার মতামতের জন্য আপনাকে @ tommy.carstensen ধন্যবাদ, আমি সবেমাত্র উত্তরের উন্নতি করেছি। মেরি ক্রিসমাস এবং শুভ নববর্ষ ;-)
ওলিব্রে

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))"

পাইথন 2 এ আপনি set()কলটি ড্রপ করতে পারেন তবে এটি কোনওভাবেই কথা বলতে পারে


1
কেন readlinesসেই বিভাজনকে লাইনে ভাগ করে joinআবারো? আপনি কেবল লিখতে পারেনprint(sys.stdin.read())
ম্যাসিফিল

এটি প্রয়োজনের চেয়ে বেশি মেমরি ব্যবহার করবে কারণ পাইথনের একটি অতিরিক্ত অ্যারে তৈরি করা দরকার।
হ্যারি মোরেনো

ঠিক আছে, আসলেই নয়, কারণ 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) এইভাবে কাজ করে এবং তাদের প্রত্যাশিত। ইনপুটটির শেষ সনাক্ত করতে আপনার কেবলমাত্র নির্ভর করা উচিত E
ম্যাসিফিল

2

এটিতে পাইপযুক্ত সকেটগুলি পড়ার জন্য কাজ করার সময় আমার কিছু সমস্যা হয়েছিল। সকেটটি বন্ধ হয়ে গেলে এটি একটি সক্রিয় লুপে খালি স্ট্রিংটি ফিরতে শুরু করে। সুতরাং এটির জন্য এটিই আমার সমাধান (যা আমি কেবল লিনাক্সে পরীক্ষা করেছি, তবে আশা করি এটি অন্যান্য সমস্ত সিস্টেমে কাজ করে)

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 এ নির্দেশ করতে পারেন


1

এই সংক্রান্ত:

for line in sys.stdin:

আমি খুব বড় ফাইলের জন্য পাইথন ২.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স্ক্রিপ্টে কমান্ড-লাইন আর্গুমেন্ট হিসাবে কীভাবে পাস করতে পারেন ? যুক্তিগুলি স্ট্রিং এবং স্ট্রিমগুলি ফাইল-জাতীয় বস্তু, সেগুলি একই নয়।
ডিফাজার

কীভাবে এটি ব্যবহার করবেন তা দেখানোর জন্য @ ডেফাজার সম্পাদনা করেছেন। আর্গুমেন্টগুলি স্ট্রিং, হ্যাঁ, তবে পাইথন ডক্স হিসাবে এবং আমি উপরে একটি পূর্ববর্তী মন্তব্যে উল্লেখ করেছি, sys.stdinএটি একটি ফাইলের মতো বস্তু
সেজেটলিন

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

-cকমান্ডটি ব্যবহার করার সময় , একটি কৌশলপূর্ণ উপায় হিসাবে, stdin(এবং কিছু ক্ষেত্রে আরও নমনীয়) পড়ার পরিবর্তে আপনি শেল স্ক্রিপ্ট কমান্ডটি পাশাপাশি পাইথন কমান্ডের কাছে $চিহ্ন দ্বারা শুরু করা প্রথম বন্ধনীতে উদ্ধৃতিতে বিক্রয় করতে পারেন p

যেমন

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

এটি গোল্ডেনডিক্টের ইতিহাস ফাইল থেকে রেখার সংখ্যা গণনা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.