Sys.stdout.writ এবং মুদ্রণের মধ্যে পার্থক্য?


375

এমন পরিস্থিতি কি আছে sys.stdout.write()যেগুলিতে অগ্রাধিকারযোগ্য print?

( উদাহরণস্বরূপ: আরও ভাল পারফরম্যান্স; কোড যা আরও অর্থবোধ করে)


4
পাইথনের কোন সংস্করণ? 2.x বা 3.x?
বায়ার্সকে চিহ্নিত করুন

সত্যিই আমি দুজনের জন্যই জানতে চাই, যদিও পাইথন 3 নিয়ে আমার কোনও অভিজ্ঞতা নেই the প্রশ্নটি আপডেট করেছেন Updated
জোহানা লারসন

17
@ এস.লোট: sys.stdout.write()এবং print(এবং / অথবা পাইথনের উভয়ই রয়েছে) এর মধ্যে মৌলিক পার্থক্য জানতে চাওয়া একটি যথাযথ যুক্তিসঙ্গত প্রশ্ন এবং উদাহরণের দরকার নেই। কমান্ড সিনট্যাক্স বিভ্রান্তিকর বলে ওপি বলেননি।
smci

উত্তর:


293

printহ'ল একটি পাতলা মোড়ক যা ইনপুটগুলিকে ফর্ম্যাট করে (পরিবর্তনযোগ্য, তবে ডিফল্টরূপে আরোগুলি এবং শেষদিকে নিউলাইনের মধ্যে স্থান সহ) এবং প্রদত্ত বস্তুর রাইটিং ফাংশনটিকে কল করে। ডিফল্টরূপে এই অবজেক্টটি sys.stdoutতবে আপনি "শেভরন" ফর্মটি ব্যবহার করে কোনও ফাইল পাস করতে পারেন। উদাহরণ স্বরূপ:

print >> open('file.txt', 'w'), 'Hello', 'World', 2+3

দেখুন: https://docs.python.org/2/references/simple_stmts.html?hightlight=print#the-print-statement


পাইথন ৩.x-এ, printএকটি ফাংশন হয়ে ওঠে, তবে তর্কটির sys.stdoutধন্যবাদ ছাড়া অন্য কিছু পাস করা এখনও সম্ভব file

print('Hello', 'World', 2+3, file=open('file.txt', 'w'))

Https://docs.python.org/3/library/function.html#print দেখুন


পাইথন ২.6++ printএ এখনও একটি বিবৃতি রয়েছে তবে এটি একটি ফাংশন হিসাবে ব্যবহার করা যেতে পারে

from __future__ import print_function

আপডেট: বাকুরিউ মুদ্রণ ফাংশন এবং মুদ্রণ বিবৃতি (এবং আরও সাধারণভাবে একটি ফাংশন এবং একটি বিবৃতি মধ্যে) মধ্যে একটি সামান্য পার্থক্য আছে তা নির্দেশ করে মন্তব্য।

যুক্তিগুলির মূল্যায়ন করার সময় কোনও ত্রুটির ক্ষেত্রে:

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception

print("something", 1/0, "other") #doesn't print anything. The function is not called

64
এটি লক্ষণীয় যে printআপনি যা লিখেন যা ঘটে না তার সাথে একটি নতুন লাইন যুক্ত করে sys.stdout.write
মাইকেল মায়ার

5
এছাড়াও sys.stdout.writeআরো সার্বজনীন যদি কখনও ডুয়াল সংস্করণ কোড (যেমন কোডটি পাইথন 2.x সেইসাথে পাইথন 3.x সঙ্গে একযোগে কাজ করে) লিখতে প্রয়োজন।
andreb

3
printprint "this",; print "on the same line as this"
@ মিশেলমিওর

1
@ bjd2385 >>এখানে আরশিফ্ট অপারেটর নয় বরং বিবৃতিটির একটি নির্দিষ্ট "শেভ্রন" ফর্ম print। দেখুন docs.python.org/2/reference/...
Luc

5
sys.stdout.write()এছাড়াও ইনপুট বাফার করে এবং তাড়াতাড়ি fd এ ইনপুট ফ্লাশ নাও করতে পারে। এটি মুদ্রণ ফাংশনের মতো আচরণ করে তা নিশ্চিত করার জন্য আপনার যুক্ত করা উচিত: sys.stdout.flush()
কেরবেলপ

151

printপ্রথমে বস্তুকে স্ট্রিংয়ে রূপান্তর করে (যদি এটি ইতিমধ্যে স্ট্রিং না হয়)। এটি যদি কোনও লাইনের শুরু এবং শেষের দিকে একটি নতুন লাইন অক্ষর না হয় তবে এটি বস্তুর আগে একটি স্পেস স্থাপন করবে।

ব্যবহার করার সময় stdout, আপনাকে অবজেক্টটি নিজেই একটি স্ট্রিংয়ে রূপান্তর করতে হবে (উদাহরণস্বরূপ "str" ​​কল করে) এবং কোনও নিউলাইন অক্ষর নেই।

সুতরাং

print 99

সমান:

import sys
sys.stdout.write(str(99) + '\n')

32
নতুন লাইনের চরিত্রটি উল্লেখ করার জন্য +1! এটিই printএবং এর মধ্যে প্রধান পার্থক্য .write()I'd
এরিক হে লেবিগোট

9
দ্রষ্টব্য: printনতুন লাইনটি বাদ দিতে তৈরি করা যেতে পারে। পাইথন ২.x এ, শেষে কমা রাখুন, এবং একটি স্পেস অক্ষর আউটপুট হবে, তবে কোনও নতুন লাইন থাকবে না। যেমন print 99,ইন পাইথন 3, print(..., end='')সম্পর্কে newline যোগ এড়াতে হবে (এবং স্থান যোগ এড়াতে, যদি না আপনি কি করতে end=' '
ToolmakerSteve

40
@ ইওএল কত মজার, ইওল নামের কেউ '' n 'সম্পর্কে মন্তব্য করেছিলেন ... এটি আমাকে হাসিয়ে তোলে। আমার কোন জীবন নেই. আমাকে হত্যা কর.
দেপাদো

2
যে সত্য নয়, printঅপারেশন আচরণ করবে python2.X মধ্যে সংকেত হ্যান্ডলার উপর সামান্য, অর্থাত্ মুদ্রণ উদাহরণে sys.stdout দিয়ে প্রতিস্থাপিত করা যাবে না: stackoverflow.com/questions/10777610/...
ddzialak

41

আমার প্রশ্ন হ'ল এমন পরিস্থিতি আছে কি না তার sys.stdout.write()চেয়ে বেশি ভাল print

অন্য দিন স্ক্রিপ্ট বিকাশ শেষ করে, আমি এটি ইউনিক্স সার্ভারে আপলোড করেছি। আমার সমস্ত ডিবাগ বার্তাগুলি printবিবৃতি ব্যবহার করেছে এবং এগুলি কোনও সার্ভার লগে প্রদর্শিত হয় না

এটি এমন একটি ক্ষেত্রে যেখানে sys.stdout.writeপরিবর্তে আপনার প্রয়োজন হতে পারে ।


8
তাই না? আপনি কি নিশ্চিত এই মধ্যে একটি পার্থক্য আছে print()এবং sys.stdout.write()যেমন মধ্যে পার্থক্য বিরোধিতা stdoutএবং stderr? ডিবাগিংয়ের জন্য, আপনার loggingমডিউলটি ব্যবহার করা উচিত , যা এতে বার্তা প্রিন্ট করে stderr
ostrokach

1
ইয়া। nohupকোনও .outফাইল ব্যবহার এবং পুনর্নির্দেশের ক্ষেত্রেও একই কথা ।
conner.xyz

1
sys.stdout.flush () এর ব্যবহার সাহায্য করবে।
সুপ্রিত চৌধারী

আপনি ব্যবহার করেন তাহলে nohupসব লেখা, ডিফল্টরূপে stdoutএবং stderrপুনরায় নির্দেশ করতে হবে nohup.out, disregarding কিনা আপনি ব্যবহার printবা stdout.write
ঝেং লিউ

40

মার্ক লুটসের লিখনিং পাইথন বইয়ের উপর ভিত্তি করে কিছু নমুনা কোড এখানে দেওয়া হয়েছে যা আপনার প্রশ্নের সমাধান করে:

import sys
temp = sys.stdout                 # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123")               # nothing appears at interactive prompt
print("another line")             # again nothing appears. it's written to log file instead
sys.stdout.close()                # ordinary file object
sys.stdout = temp                 # restore print commands to interactive prompt
print("back to normal")           # this shows up in the interactive prompt

একটি পাঠ্য সম্পাদকটিতে log.txt খোলার মাধ্যমে নিম্নলিখিতগুলি প্রকাশিত হবে:

testing123
another line

এমন কোনও উপায় আছে যাতে আমি স্ক্রিনে মুদ্রণের পাশাপাশি ফাইলটিতেও লিখতে পারি?
দেवेश সায়নী

5
@ দেবেশেশাইনি: হ্যাঁ, কমপক্ষে একটি লেখার () এবং ফ্লাশ () ফাংশন রয়েছে এমন একটি প্রক্সি ক্লাসের সাথে sys.stdout সরিয়ে দিন। আমি এখানে উদাহরণ স্নিপেট লিখেছি ।
পনিকাট

14

কমপক্ষে একটি পরিস্থিতি রয়েছে যেখানে আপনি sys.stdoutমুদ্রণের পরিবর্তে চান ।

আপনি যখন পরের লাইনে না গিয়ে একটি লাইন ওভাররাইট করতে চান, উদাহরণস্বরূপ প্রগতি বার বা স্থিতি বার্তা আঁকানোর সময় , আপনাকে এমন কিছু লুপ করতে হবে

Note carriage return-> "\rMy Status Message: %s" % progress

এবং যেহেতু মুদ্রণ একটি নতুন লাইন যুক্ত করে, তাই আপনি ব্যবহার করা ভাল sys.stdout


2
যদি মুদ্রণ একটি নতুন লাইন যুক্ত করে তবে কেবল তার পরিবর্তে কেবল ('বার্তা', শেষ = '') মুদ্রণ করবেন না কেন?
অপুরভ পাটনে

8

আমার প্রশ্ন হ'ল এমন পরিস্থিতি আছে কি না তার sys.stdout.write()চেয়ে বেশি ভালprint

আপনি যদি একটি কমান্ড লাইন অ্যাপ্লিকেশন লিখছেন যা ফাইল এবং স্টাডআউট উভয়কেই লিখতে পারে তবে এটি কার্যকর। আপনি যেমন কাজ করতে পারেন:

def myfunc(outfile=None):
    if outfile is None:
        out = sys.stdout
    else:
        out = open(outfile, 'w')
    try:
        # do some stuff
        out.write(mytext + '\n')
        # ...
    finally:
        if outfile is not None:
            out.close()

এর অর্থ এই নয় যে আপনি with open(outfile, 'w') as out:প্যাটার্নটি ব্যবহার করতে পারবেন না , তবে কখনও কখনও এটি মূল্যবান হয়।


কঠোরভাবে বলতে গেলে, আপনি ব্যবহার করতে পারেন with- def process(output): # .../ if outfile is None: process(sys.stdout) else: with open(outfile, 'w') as out: process(out)(অবশ্যই যেখানে প্রয়োজন সেখানে নতুন লাইন যোগ করা)। এটি অবশ্যই খুব পরিষ্কার নয়, যদিও এটি নিশ্চিত।
ফান্ড মনিকার লসুইট

4

২.x-এ, printবিবৃতিটি আপনি যা দেন তা প্রাক-প্রক্রিয়াজাত করে, এটিকে পথে স্ট্রিংগুলিতে পরিণত করে, বিভাজক এবং নতুনলাইনগুলি পরিচালনা করে এবং কোনও ফাইলে পুনঃনির্দেশকে মঞ্জুরি দেয়। 3.x এটি একটি ফাংশনে পরিণত করে, তবে এর এখনও একই দায়িত্ব রয়েছে।

sys.stdout একটি ফাইল বা ফাইলের মতো এটিতে লেখার জন্য পদ্ধতি রয়েছে যা স্ট্রিং বা সেই লাইনের সাথে কিছু নেয় take


3

ডায়নামিক মুদ্রণ কার্যকর হয়, উদাহরণস্বরূপ, দীর্ঘ প্রক্রিয়াতে তথ্য দেওয়ার জন্য এটি পছন্দনীয়:

import time, sys
Iterations = 555
for k in range(Iterations+1):
    # some code to execute here ...
    percentage = k / Iterations
    time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
    sys.stdout.write(time_msg)
    sys.stdout.flush()
    time.sleep(0.01)

2
মুদ্রণ (time_msg, শেষ = '') পরিবর্তে sys.stdout.write (time_msg) sys.stdout.flush () এছাড়াও কাজ করে
rluts

2
>>> sys.stdout.write(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1

উপরের উদাহরণ পর্যবেক্ষণ:

  1. sys.stdout.writeনন-স্ট্রিং অবজেক্ট লিখবে না, তবে printকরবে

  2. sys.stdout.writeশেষ পর্যন্ত কোনও নতুন লাইন প্রতীক যুক্ত করবে না, তবে printকরবে

যদি আমরা গভীরভাবে ডুব দিই,

sys.stdout একটি ফাইল অবজেক্ট যা মুদ্রণের আউটপুট জন্য ব্যবহার করা যেতে পারে ()

যদি ফাইল আর্গুমেন্ট print()নির্দিষ্ট না করা হয়, sys.stdoutব্যবহৃত হবে


1

এমন কি পরিস্থিতি রয়েছে যেখানে sys.stdout.write () মুদ্রণ করা ভাল?

উদাহরণস্বরূপ, আমি ছোট ফাংশনে কাজ করছি যা যুক্তি হিসাবে সংখ্যাটি পাস করার পরে পিরামিড ফর্ম্যাটে তারাগুলি মুদ্রণ করে, যদিও আপনি পৃথক লাইনে মুদ্রণ করতে শেষ = "" ব্যবহার করে এটি অর্জন করতে পারেন , আমি সমন্বয়-এ sys.stdout.writ ব্যবহার করেছি এই কাজটি করতে মুদ্রণ সহ এই stdout.writ প্রিন্টগুলি একই লাইনে প্রিন্ট করুন যেখানে মুদ্রণ হিসাবে সর্বদা এটির বিষয়বস্তু পৃথক লাইনে প্রিন্ট করে।

import sys

def printstars(count):

    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1

printstars(5)

1

এমন কি পরিস্থিতি রয়েছে যেখানে sys.stdout.write () মুদ্রণ করা ভাল?

আমি খুঁজে পেয়েছি যে স্টাডাউট একটি মাল্টিথ্রেডিং পরিস্থিতিতে মুদ্রণের চেয়ে আরও ভাল কাজ করে। আমি মুদ্রণের জন্য লাইনগুলি সঞ্চয় করতে কাতার (FIFO) ব্যবহার করি এবং আমার মুদ্রণ প্রশ্ন খালি না হওয়া পর্যন্ত আমি সমস্ত থ্রেড প্রিন্ট লাইনের আগেই ধরে রাখি। তবুও, মুদ্রণ ব্যবহার করে আমি কখনও কখনও ডিবাগ আই / ও-তে চূড়ান্ত lose n হারাতে পারি (উইং প্রো আইডিই ব্যবহার করে)।

আমি যখন স্ট্রিংয়ে d n দিয়ে std.out ব্যবহার করি তখন ডিবাগ I / O ফর্ম্যাটগুলি সঠিকভাবে প্রদর্শিত হয় এবং। N এর সঠিকভাবে প্রদর্শিত হয়।


এক্ষেত্রে প্রিন্টের চেয়ে স্টাডাউটের আরও ভাল কাজ করার কোনও কারণ কি আপনি জানেন বা এটি অজানা? আপনি যেখানে একটি সংক্ষিপ্ত কাজের উদাহরণ প্রদান করতে পারেন?
ব্যবহারকারী2653663

আমার চিন্তা হ'ল স্টাডাউট মুদ্রণের চেয়ে নিম্ন স্তরে কাজ করে। আমার স্পষ্টতই থ্রেড দুর্নীতি হয়েছিল কারণ দুটি মুদ্রণ রুটিন স্টাডাউটের মাধ্যমে খাওয়ানোর জন্য লড়াই করছিল। প্রতিটি থ্রেড থেকে একজনকে স্টডআউট করার জন্য লেখা আমার জন্য দুর্নীতি সরিয়ে দিয়েছে।
ডেভিড পাউন্ডল


1

পাইথন 3-তে প্রিন্ট ওভার ব্যবহারের বৈধ কারণ রয়েছে sys.stdout.write, তবে এই কারণে sys.stdout.writeপরিবর্তে ব্যবহারের কারণকেও পরিণত করা যেতে পারে ।

এই কারণটি হ'ল, এখন মুদ্রণটি পাইথন 3 এ একটি ফাংশন, আপনি এটি ওভাররাইড করতে পারেন। সুতরাং আপনি একটি সহজ স্ক্রিপ্টে সর্বত্র মুদ্রণ ব্যবহার করতে পারেন এবং stderrপরিবর্তে সেইগুলি মুদ্রণ বিবৃতি লিখতে হবে তা স্থির করে নিতে পারেন । আপনি এখন কেবল মুদ্রণ ফাংশনটিকে নতুনভাবে সংজ্ঞায়িত করতে পারেন, এমনকি বিল্টিনস মডিউলটি ব্যবহার করে মুদ্রণ ফাংশনটিকে বৈশ্বিক পরিবর্তন করতে পারেন। অফ কোর্সের মাধ্যমে file.writeআপনি ফাইলটি নির্দিষ্ট করতে পারবেন তবে ওভাররাইটিং প্রিন্টের সাহায্যে আপনি লাইন বিভাজক বা আর্গুমেন্ট বিভাজককেও নতুন সংজ্ঞা দিতে পারবেন।

অন্য উপায় কাছাকাছি হয়। সম্ভবত আপনি নিশ্চিত যে আপনি লিখেছেন stdout, তবে আপনি জানেন যে আপনি মুদ্রণ অন্য কোনওটিতে পরিবর্তন করতে চলেছেন, আপনি ব্যবহার করার সিদ্ধান্ত নিতে পারেন sys.stdout.write, এবং ত্রুটি লগ বা অন্য কোনও কিছুর জন্য মুদ্রণটি ব্যবহার করতে পারেন ।

সুতরাং, আপনি কী ব্যবহার করবেন তা নির্ভর করে আপনি কীভাবে এটি ব্যবহার করবেন। printআরও নমনীয়, তবে এটি ব্যবহার করার এবং এটি ব্যবহার না করার কারণ হতে পারে। আমি তার পরিবর্তে নমনীয়তার জন্য বেছে নেব এবং মুদ্রণটি বেছে নেব। printপরিবর্তে ব্যবহারের অন্য কারণ হ'ল পরিচিতি। মুদ্রণ দ্বারা আপনি কী বোঝাতে চেয়েছেন এবং কম জানেন তা এখন আরও বেশি লোক sys.stdout.write


1

একটি হ'ল হেক্সাডেসিমাল উপস্থিতিতে বাইট মুদ্রণের চেষ্টা করার সময় তফাতগুলির মধ্যে একটি নিম্নরূপ। উদাহরণ হিসেবে বলা যায়, আমরা যে দশমিক মান জানি 255হয় 0xFFহেক্সাডেসিমেল চেহারা:

val = '{:02x}'.format(255) 

sys.stdout.write(val) # prints ff2
print(val)            # prints ff

এটি এই সম্পর্কে কি না। এটি কেবলমাত্র একটি ইন্টারেক্টিভ শেলের মধ্যে ঘটবে এবং কারণ ... ফাংশনটির রিটার্ন মান (লিখিত অক্ষরের সংখ্যা) write()যুক্ত করে না \nএবং ফেরত দেয় না , হেক্সাডেসিমাল উপস্থাপনা বা প্রদর্শিত হতে পারে এমন অন্য কোনও সামগ্রী অবিচ্ছিন্ন।
ওন্দ্রেজ কে।

0

পাইথন 2-এ যদি আপনাকে কোনও ফাংশনটি অতিক্রম করতে হয় তবে আপনি os.sys.stdout.writ কে একটি ভেরিয়েবলের জন্য বরাদ্দ করতে পারেন, আপনি মুদ্রণ সহ এটি (প্রতিস্থাপনে) করতে পারবেন না।

>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>> 

এটি প্রত্যাশার মতো কাজ করে।

>>> cmd=print
  File "<stdin>", line 1
    cmd=print
            ^
SyntaxError: invalid syntax

যে কাজ করে না। মুদ্রণ একটি যাদু ফাংশন।


0

পাইথন 3 এর মধ্যে printএবং sys.stdout.writeনির্দেশ করার মধ্যে একটি পার্থক্য হ'ল টার্মিনাল এ কার্যকর হওয়ার পরে ফেরত দেওয়া মান। পাইথন 3 sys.stdout.writeস্ট্রিংয়ের দৈর্ঘ্য প্রদান করে যেখানে printকেবল ফিরে আসেNone

সুতরাং উদাহরণস্বরূপ টার্মিনালে ইন্টারেক্টিভভাবে নিম্নলিখিত কোড চালানো তার দৈর্ঘ্যের পরে স্ট্রিংটি মুদ্রণ করবে, যেহেতু ইন্টারেক্টিভভাবে চালিত হওয়ার সময় দৈর্ঘ্য ফিরে আসে এবং আউটপুট হয়:

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