উত্তর:
আপনি fileinput
মডিউলটি ব্যবহার করতে পারেন :
import fileinput
for line in fileinput.input():
pass
fileinput
কমান্ড-লাইন আর্গুমেন্টে দেওয়া ফাইলের নাম হিসাবে নির্দিষ্ট ইনপুটটিতে সমস্ত লাইন লুপ করবে, বা কোনও আর্গুমেন্ট সরবরাহ না করা থাকলে স্ট্যান্ডার্ড ইনপুট।
দ্রষ্টব্য: line
এতে একটি পিছনের নিউলাইন থাকবে; এটি ব্যবহার অপসারণline.rstrip()
এটি করার কয়েকটি উপায় রয়েছে।
sys.stdin
একটি ফাইলের মতো বস্তু যার উপর আপনি ফাংশনগুলি কল করতে পারেন read
বা readlines
আপনি যদি সমস্ত কিছু পড়তে চান বা আপনি সবকিছু পড়তে চান এবং স্বয়ংক্রিয়ভাবে নতুন লাইনে বিভক্ত হন। ( import sys
এটি কাজ করার জন্য আপনার প্রয়োজন ))
আপনি যদি ইনপুটটির জন্য ব্যবহারকারীকে প্রম্পট করতে চান , আপনি raw_input
পাইথন ২. এক্স এবং কেবল input
পাইথন 3 এ ব্যবহার করতে পারেন ।
আপনি যদি কেবল কমান্ড-লাইন বিকল্পগুলি পড়তে চান তবে আপনি সেগুলি sys.argv তালিকার মাধ্যমে অ্যাক্সেস করতে পারেন ।
আপনি সম্ভবত পাইথনের আই / ও-তে এই উইকিবুক নিবন্ধটি একটি দরকারী রেফারেন্স হিসাবে দেখতে পাবেন।
import sys
for line in sys.stdin:
print(line)
নোট করুন যে এর শেষে একটি নতুনলাইন চরিত্র অন্তর্ভুক্ত থাকবে। শেষের দিকে line.rstrip()
নিউলাইনটি সরাতে, @ ব্রিতোহালোরান যেমন বলেছিলেন তেমন ব্যবহার করুন ।
\r\n
লাইন শেষের সাথে সঠিকভাবে মোকাবেলা করবে না
পাইথনের বিল্ট-ইন ফাংশন রয়েছে input()
এবং raw_input()
। বিল্ট-ইন ফাংশনগুলির অধীনে পাইথন ডকুমেন্টেশন দেখুন ।
উদাহরণ স্বরূপ,
name = raw_input("Enter your name: ") # Python 2.x
অথবা
name = input("Enter your name: ") # Python 3
পাইথন শেখার থেকে এখানে :
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.
print(sum(chunk.count('\n') for chunk in iter(partial(sys.stdin.read, 1 << 15), '')))
। দেখুনwc-l.py
cat
অপ্রয়োজনীয়। ইউনিক্স সিস্টেমগুলির জন্য সঠিক প্রার্থনাটি হ'ল python countlines.py < countlines.py
।
readlines()
। ফাইলের অবজেক্টগুলি মেমরিতে সমস্ত ডেটা না করেই পুনরাবৃত্তি করার উদ্দেশ্যে।
পাইথনের স্টিডিন থেকে আপনি কীভাবে পড়বেন?
আমি কোড গল্ফ চ্যালেঞ্জগুলির কয়েকটি করার চেষ্টা করছি, তবে তাদের সকলকে স্টিডিনের কাছ থেকে নেওয়া দরকার। পাইথনে আমি কীভাবে এটি পাব?
তুমি ব্যবহার করতে পার:
sys.stdin
- একটি ফাইলের মতো বস্তু - sys.stdin.read()
সমস্ত কিছু পড়তে কল করুন ।input(prompt)
- এটি আউটপুটে anচ্ছিক প্রম্পটটি পাস করুন, এটি স্টিডিন থেকে শুরু করে প্রথম নিউলাইন পর্যন্ত পড়ে, যা এটি স্ট্রিপ করে। আরও লাইন পেতে আপনাকে বারবার এটি করতে হবে, ইনপুট শেষে এটি ইওফেরার উত্থাপন করে। (সম্ভবত গল্ফিংয়ের জন্য দুর্দান্ত নয়)) পাইথন 2 এ এটি rawinput(prompt)
।open(0).read()
- পাইথন 3-এ, বিল্টিন ফাংশন ফাইল বর্ণনাকারীopen
গ্রহণ করে (অপারেটিং সিস্টেম IO সংস্থানসমূহ উপস্থাপন করে পূর্ণসংখ্যা), এবং 0 এর বিবরণী । এটি কোনও ফাইলের মতো বস্তুটি ফেরত দেয় - সম্ভবত গল্ফ করার জন্য আপনার সেরা বাজি। পাইথন 2 এ, এটি ।stdin
sys.stdin
io.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
ফাইলগুলির একটি সিরিজে পড়া হয়।
অন্যদের দ্বারা প্রস্তাবিত উত্তর:
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 এ কেবল বাফারিং জড়িত থাকতে পারে, যাতে আপনি প্রিন্ট কল জারির আগে বাফার পূরণের জন্য বা ইওএফের জন্য অপেক্ষা করতে পারেন।
for line in sys.stdin:
প্যাটার্ন নেই ফাইলের শেষে জন্য অপেক্ষা করুন। আপনি যদি খুব ছোট ফাইলগুলিতে পরীক্ষা করেন তবে প্রতিক্রিয়াগুলি বাফার হতে পারে। এটি মধ্যবর্তী ফলাফলগুলি পড়ে তা দেখতে আরও ডেটা দিয়ে পরীক্ষা করুন।
print line
3.1.3 এ জেগে ওঠে না, তবে print(line)
তা করে।
for line in sys.stdin:
"ইওএফ অবধি" অবরুদ্ধ করে না। পাইথন 2 এ একটি রিড-ফরোড বাগ রয়েছে যা সংশ্লিষ্ট বাফারটি পূর্ণ না হওয়া পর্যন্ত লাইনগুলিকে বিলম্ব করে। এটি একটি বাফারিং ইস্যু যা ইওএফ সম্পর্কিত নয়। কার্যক্ষমতার জন্য, ব্যবহার করুন for line in iter(sys.stdin.readline, ''):
( io.open()
সাধারণ ফাইলগুলির জন্য ব্যবহার করুন )। পাইথন 3 এ আপনার দরকার নেই
সমস্ত আঞ্জর ব্যবহার করে বিল্ডিং করা 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
।
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 -
add_argument('--in'
এবং তারপরে স্ক্রিপ্টে পাইপ --in -
করে কমান্ড লাইনে যুক্ত করতে পারে। in
ভেরিয়েবল / বৈশিষ্ট্যের জন্য পিএস খুব ভাল নাম নয় good
in
চলকটির জন্য কেবল একটি খারাপ নাম নয়, এটি অবৈধ। সংরক্ষিত কীওয়ার্ডের args.in.read()
কারণে অবৈধ সংশ্লেষ ত্রুটি বাড়িয়ে তুলবে in
। infile
পাইথন আরগপারস ডক্সের মতো করে কেবল নামকরণ করতে পারেন: ডকস.পিথোন.আর
নিম্নলিখিত কোডের চিপ আপনাকে সহায়তা করবে (এটি স্ট্রিনে ব্লক করা সমস্ত পড়বে EOF
, একটি স্ট্রিংয়ে):
import sys
input_str = sys.stdin.read()
print input_str.split()
আমি অবাক হয়েছি এখনও পর্যন্ত কেউ এই হ্যাকটির কথা উল্লেখ করেনি:
python -c "import sys; set(map(sys.stdout.write,sys.stdin))"
পাইথন 2 এ আপনি set()
কলটি ড্রপ করতে পারেন তবে এটি কোনওভাবেই কথা বলতে পারে
readlines
সেই বিভাজনকে লাইনে ভাগ করে join
আবারো? আপনি কেবল লিখতে পারেনprint(sys.stdin.read())
write
আয় ফিরে আসে None
এবং সেট আকারটি কখনই 1 ( =len(set([None]))
) এর বেশি হবে না
আপনি স্টিডিন থেকে পড়তে পারেন এবং তারপরে ইনপুটগুলিকে "ডেটা" তে সঞ্চয় করতে পারেন :
data = ""
for line in sys.stdin:
data += line
data = sys.stdin.read()
বারবার স্ট্রিং কনটেন্টেশনগুলির সমস্যা ছাড়াই করা যেতে পারে ।
উইন্ডোজ থেকে বাইনারি ডেটা পড়ুন 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()
আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করি, এটি স্ট্ডিনের থেকে একটি স্ট্রিং দেয় (আমি এটি জসন পার্সিংয়ের জন্য ব্যবহার করি)। এটি উইন্ডোতে পাইপ এবং প্রম্পট দিয়ে কাজ করে (লিনাক্সে এখনও পরীক্ষিত হয়নি)। জিজ্ঞাসা করার সময়, দুটি লাইন বিরতি ইনপুটটির শেষ নির্দেশ করে।
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
সমস্যার সমাধান আমার আছে
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)
select
ডাকা হয় তখন প্রায় "প্রস্তুত" হবে না ; অথবা স্টিডিন যদি ধীর মাধ্যমের কোনও নেটওয়ার্কের (নেটওয়ার্ক, সিডি, টেপ, ইত্যাদি) সাথে সংযুক্ত থাকে তবে আপনি সমস্যার সম্মুখীন হতে পারেন। আপনি বলেছিলেন যে "আপনি যদি স্টাডিনের কাছে কোনও ডেটা না দিয়ে থাকেন তবে তা চিরতরে অবরুদ্ধ হয়ে যাবে" " একটি হল সমস্যা , কিন্তু আমি এটি একটি এর বলতেন বৈশিষ্ট্য । বেশিরভাগ সিএলআই প্রোগ্রাম (যেমন cat
) এইভাবে কাজ করে এবং তাদের প্রত্যাশিত। ইনপুটটির শেষ সনাক্ত করতে আপনার কেবলমাত্র নির্ভর করা উচিত E
এটিতে পাইপযুক্ত সকেটগুলি পড়ার জন্য কাজ করার সময় আমার কিছু সমস্যা হয়েছিল। সকেটটি বন্ধ হয়ে গেলে এটি একটি সক্রিয় লুপে খালি স্ট্রিংটি ফিরতে শুরু করে। সুতরাং এটির জন্য এটিই আমার সমাধান (যা আমি কেবল লিনাক্সে পরীক্ষা করেছি, তবে আশা করি এটি অন্যান্য সমস্ত সিস্টেমে কাজ করে)
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 এ নির্দেশ করতে পারেন
এই সংক্রান্ত:
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
sys.stdin
স্ক্রিপ্টের একটি কমান্ড-লাইন যুক্তি হিসাবে পাস করছি ।
sys.stdin
স্ক্রিপ্টে কমান্ড-লাইন আর্গুমেন্ট হিসাবে কীভাবে পাস করতে পারেন ? যুক্তিগুলি স্ট্রিং এবং স্ট্রিমগুলি ফাইল-জাতীয় বস্তু, সেগুলি একই নয়।
sys.stdin
এটি একটি ফাইলের মতো বস্তু
জন্য পাইথন 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
নেই
os.read(0, x)
যা 0 যা stdin প্রতিনিধিত্ব করে থেকে xbytes পড়ে। এটি একটি unfuffered পড়া, sys.stdin.read () এর চেয়ে কম স্তর
-c
কমান্ডটি ব্যবহার করার সময় , একটি কৌশলপূর্ণ উপায় হিসাবে, stdin
(এবং কিছু ক্ষেত্রে আরও নমনীয়) পড়ার পরিবর্তে আপনি শেল স্ক্রিপ্ট কমান্ডটি পাশাপাশি পাইথন কমান্ডের কাছে $
চিহ্ন দ্বারা শুরু করা প্রথম বন্ধনীতে উদ্ধৃতিতে বিক্রয় করতে পারেন p
যেমন
python3 -c "import sys; print(len(sys.argv[1].split('\n')))" "$(cat ~/.goldendict/history)"
এটি গোল্ডেনডিক্টের ইতিহাস ফাইল থেকে রেখার সংখ্যা গণনা করবে।