পাইথনে একই লাইনে একাধিক প্রিন্ট


229

আমি একটি স্ক্রিপ্ট চালাতে চাই, যা মূলত এরকম একটি আউটপুট দেখায়:

Installing XXX...               [DONE]

বর্তমানে, আমি Installing XXX...প্রথমে মুদ্রণ করি এবং তারপরে আমি মুদ্রণ করি [DONE]

যাইহোক, আমি এখন মুদ্রণ করতে চাই Installing xxx...এবং [DONE]একই লাইনে।

কোন ধারনা?



1
এই প্রশ্নের উত্তর আপনি লাইন পরিষ্কার করতে চাই, উল্লেখ না কখনও কখনও দেখুন: stackoverflow.com/questions/45263205
ideasman42

উত্তর:


284

আপনি printআমদানি না করে এটি করতে বিবৃতিটি ব্যবহার করতে পারেন sys

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

printলাইনের শেষে কমা printএকটি নতুন লাইন জারি করা থেকে বাধা দেয় (আপনার লক্ষ্য করা উচিত যে আউটপুট শেষে একটি অতিরিক্ত স্থান থাকবে)।

পাইথন 3 সমাধান
যেহেতু উপরের পাইথন 3 এ কাজ করে না, আপনি এটি পরিবর্তে এটি করতে পারেন (আবার আমদানি না করে sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

মুদ্রণ ফাংশন একটি endপরামিতি গ্রহণ করে যা ডিফল্ট হয় "\n"। এটিকে একটি খালি স্ট্রিংয়ে সেট করা লাইনের শেষে নতুন লাইন প্রদান থেকে বাধা দেয়।


1
এটি পুরোপুরি কাজ করে। এখনও অবধি কেবল স্টাডাউট সমাধান দেখেছি। সত্যিই এটা জেনে ভাল।
প্রমিথিউস

5
যদি আপনার উভয় প্রিন্ট এবং সময়সইয়ের ক্রিয়া উভয় (একই ফাংশন / ইনডেন্টেশন স্তরের সমস্ত) থাকে তবে এটি কাজ করে না। ক্রিয়া শুরুর আগে কোনও আউটপুট পাওয়া যায় না এবং শেষ হওয়ার পরে আউটপুট পুরো প্রদর্শিত হয়
প্যাড্রে

2
সামগ্রিকভাবে প্রক্রিয়াটির জন্য ওএস দ্বারা প্রবর্তিত আউটপুট বাফারিংয়ের এটি সম্ভবত আরও বেশি কিছু, যা অজগর-নির্দিষ্ট সমস্যা নয়। পাইথন-নির্দিষ্ট কাজের জন্য স্ট্যাকওভারফ্লো / সেকশনস 107705 দেখুন ।
একাধিক

13
কোনও নিউলাইন ছাড়াই আপনি সম্ভবত স্পষ্টভাবে বাফারটি ফ্লাশ করতে চান। print("...", end="", flush=True)পাইথন 3 ব্যবহার করুন , পাইথন 2 এ একটি sys.stdout.flush()কল যুক্ত করুন।
মার্টিজন পিটারস

7
অজগর 3.x এ আপনি প্রিন্ট করা লাইন ভিএস এর শেষে সংযোজন করে শেষ করতে একটি "\ r" যুক্ত করতে চানprint("Progress: {}%".format(var), end="\r", flush=True)
জন

103

আপনি কেবল এটি ব্যবহার করতে পারেন:

print 'something',
...
print ' else',

এবং আউটপুট হবে

something else

দ্বারা overkill প্রয়োজন নেই import sys। শেষে কমা প্রতীক মনোযোগ দিন।

পাইথন 3+ print("some string", end=""); শেষে নতুন লাইন সন্নিবেশ সরাতে। আরও পড়ুনhelp(print);


3
দ্রষ্টব্য এই পদ্ধতিটি ব্যবহার করে দুটি স্পেস রয়েছে
ইথানজাইক্স

1
এটি সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উত্তর।
gixxer

মুদ্রণের যুক্তিগুলি প্রথম বন্ধনীতে থাকলে এটি কাজ করে না। এটি কাজ করে: <প্রিন্ট "হ্যালো" ,; মুদ্রণ ("হ্যালো")> তবে এটি কাজ করে না <মুদ্রণ ("হ্যালো",); মুদ্রণ ("হ্যালো")>
মায়াঙ্ক জয়সওয়াল

@ মায়াঙ্কজইসওয়াল এটি প্যারেন্সের সাথে কাজ করে। মুদ্রণ ('হ্যালো'),
ড্রাগগ্লোভ

1
printফাংশন বনাম 3. পাইথন 2 কিছুটা ভিন্ন সিনট্যাক্স হয়েছে
boldnik

52

কনসোল আউটপুটে আগের অবস্থানে ফিরে যেতে আপনার ব্যাকস্পেস ' \ r ' বা (' \ x08 ') চর ব্যবহার করা উচিত

পাইথন 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

পাইথন 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

এই কোডটি এক লাইনে 0% থেকে 100% পর্যন্ত গণনা করা হবে। চূড়ান্ত মান হবে:

> python test.py
100%

এই ক্ষেত্রে ফ্লাশ সম্পর্কে অতিরিক্ত তথ্য এখানে: পাইথন মুদ্রণ বিবৃতিগুলিতে 'এন্ড =' আর্গুমেন্টগুলি কেন লুপগুলিতে আলাদা আচরণ করে?


1
স্পষ্ট করার জন্য, দেখে মনে হচ্ছে এই মন্তব্যে কমেন্ট-আউট কোডটি পাইথন 2 এর জন্য, এবং অ-মন্তব্য করা লাইনগুলি পাইথন 3-এর জন্য রয়েছে
টার্টলস আর কিউট

1
পাইথন 3 এ মাথার লাইনগুলি সূক্ষ্মভাবে কাজ করবে you আপনি যদি '\ x08' ব্যাকস্পেস হিসাবে ব্যবহার করেন তবে আপনাকে আউটপুট স্ট্রিমটি ফ্লাশ করতে হবে - মুদ্রণ ((b '\ x08' * n)। ডেকোড (), শেষ = '', ফ্লাশ = সত্য)
ভাদিম জিন

1
গাড়ি ফেরত '\ R', পিছনে লাইন শুরুতে যাওয়া তাই '* এন' অপ্রয়োজনীয়
bjnortier

43

ব্যবহার করুন sys.stdout.write('Installing XXX... ')এবং sys.stdout.write('Done')। আপনি "\n"মুদ্রণ কার্যকারিতা পুনরায় তৈরি করতে চাইলে এই ভাবে আপনাকে নতুন লাইন যুক্ত করতে হবে। আমি মনে করি যে কেবল এটির জন্য অভিশাপ ব্যবহার করা অপ্রয়োজনীয় হতে পারে।


4
আমি ব্যক্তিগতভাবে উচ্চতর ভোটের একটিতে এই সমাধানটিকে পছন্দ করি কারণ এটি __future__আমদানি বা এর মতো কোনও কিছুর উপর নির্ভর করার প্রয়োজন ছাড়াই পাইথন 2.x এবং পাইথন 3.x এ ঠিক একইভাবে কাজ করে ।
মিগিলসন

17

কোনও উত্তরই আমার পক্ষে কার্যকর হয়নি, কারণ একটি নতুন লাইনের মুখোমুখি না হওয়া পর্যন্ত সেগুলি সমস্ত বিরতি দিয়েছিল। আমি একটি সহজ সহায়ক লিখেছি:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

এটি পরীক্ষা করার জন্য:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"হ্যালো" প্রথমে প্রিন্ট আউট করে ঘুমানোর আগে পর্দায় ফ্লাশ করবে। এর পরে আপনি স্ট্যান্ডার্ড প্রিন্ট ব্যবহার করতে পারেন।


1
ধন্যবাদ! ঠিক আমার কী প্রয়োজন ওরফে .ফ্লুশ ()
মিঃনাইস


11

সর্বাধিক সহজ:

পাইথন ঘ

    print('\r' + 'something to be override', end='')

এর অর্থ এটি কার্সারটি শুরুতে ফিরে আসবে, তার চেয়ে কিছু মুদ্রণ করবে এবং একই লাইনে শেষ হবে। যদি কোনও লুপে থাকে তবে এটি একই জায়গায় মুদ্রণ শুরু করবে।


3
শান্ত! উইন্ডোজেও কাজ করে।
শীতল শাহ

2
ধন্যবাদ এটি আমার জন্য ভাল কাজ করে! আমি মনে করি print(’something to be override’, end=‘\r’)এটি সহজ, যদিও।
ট্রপিলিও


9

মুদ্রণের একটি alচ্ছিক endযুক্তি রয়েছে, শেষ পর্যন্ত এটিই মুদ্রিত হয়। ডিফল্টটি একটি নতুন লাইন, তবে আপনি এটি খালি স্ট্রিংয়ে পরিবর্তন করতে পারেন। যেমনprint("hello world!", end="")


2
এটি পাইথন ৩. অজগর 2 এ আপনি সহজভাবে করতে পারেন print 'something',। শেষে কমা একটি নতুন লাইন যুক্ত হওয়া রোধ করে।
আরজুন

4

আপনি আগের লাইন (বদলে ক্রমাগত চাইলে এটিকে সমৃদ্ধ) ওপর দিয়েই লিখতে চান, আপনি একত্রিত করতে পারেন \rসঙ্গে print(),মুদ্রণ বিবৃতি শেষে। উদাহরণ স্বরূপ,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

কনসোলে পুরানো নম্বরটি প্রতিস্থাপন করে 0 থেকে 9 গণনা করা হবে। "...DONE!"গত কাউন্টার, 9 হিসাবে একই লাইনে প্রিন্ট করবে।

ওপি-র ক্ষেত্রে আপনার ক্ষেত্রে এটি কনসোলটিকে "অগ্রগতি বার" হিসাবে ইনস্টলের সম্পূর্ণ সম্পূর্ণ প্রদর্শন করতে অনুমতি দেবে, যেখানে আপনি একটি শুরু এবং শেষের অক্ষর অবস্থান নির্ধারণ করতে পারেন এবং এর মধ্যে চিহ্নিতকারীগুলিকে আপডেট করতে পারেন।

print("Installing |XXXXXX              | 30%"),

4

এখানে @ ভাদিম-জিন4ুকের 3.0 সংস্করণ থেকে প্রাপ্ত 2.7- সামঞ্জস্যপূর্ণ সংস্করণ:

পাইথন 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

এই বিষয়ে, প্রদত্ত 3.0 সমাধানটি কিছুটা পুষ্পিত দেখায়। উদাহরণস্বরূপ, ব্যাকস্পেস পদ্ধতিটি পূর্ণসংখ্যার যুক্তি ব্যবহার করে না এবং সম্ভবত সম্পূর্ণরূপে এটি সম্পন্ন করা যেতে পারে।

পাইথন ঘ

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

উভয়ই পরীক্ষা এবং কাজ করা হয়েছে।


2

এটি একটি খুব পুরানো থ্রেড, তবে এখানে একটি খুব পুঙ্খানুপুঙ্খ উত্তর এবং নমুনা কোড।

\rASCII অক্ষর সেট থেকে ক্যারেজ রিটার্নের স্ট্রিং প্রতিনিধিত্ব । এটি অষ্টাল 015[ chr(0o15)] বা হেক্সিডিসিমাল 0d[ chr(0x0d)] বা দশমিক 13[ chr(13)] এর সমান । man asciiবিরক্তিকর পড়ার জন্য দেখুন । এটি ( \r) একটি সুন্দর বহনযোগ্য উপস্থাপনা এবং লোকেদের পক্ষে পড়া সহজ। এটি খুব সহজভাবে বোঝানো হয়েছে যে কাগজটি অগ্রগতি না করেই টাইপ রাইটারের উপরের সমস্ত পথ যাত্রা শুরুতে ফিরে যেতে। এটি এর CRঅংশ CRLFযার অর্থ ক্যারিজ রিটার্ন এবং লাইন ফিড

print()পাইথন 3-এ একটি ফাংশন Py পাইথন 2-তে (যে কোনও সংস্করণ যা আপনি ব্যবহার করতে আগ্রহী হন), মডিউল printথেকে এর সংজ্ঞা আমদানি করে কোনও কার্যে বাধ্য করা যেতে পারে be ফাংশনটির __future__সুবিধাটি printহ'ল আপনি \nপ্রতিটি print()কলের শেষে একটি নিউলাইন মুদ্রণের ডিফল্ট আচরণকে ওভাররাইড করে শেষে কী প্রিন্ট করবেন তা নির্দিষ্ট করতে পারেন ।

sys.stdout.flushপাইথনকে স্ট্যান্ডার্ড আউটপুটটির আউটপুট ফ্লাশ করতে বলে , যা print()আপনি অন্যথায় নির্দিষ্ট না করে আপনি আউটপুট প্রেরণ করেন । আপনি python -uপরিবেশের ভেরিয়েবলটি চালিয়ে বা সেট করে একই আচরণ পেতে পারেন PYTHONUNBUFFERED=1, যার মাধ্যমে কলগুলি import sysএবং এড়িয়ে যাওয়া যায় sys.stdout.flush()। এটি করে আপনি যে পরিমাণ অর্থ অর্জন করছেন তা প্রায় শূন্য এবং আপনার অ্যাপ্লিকেশনটি সঠিকভাবে আচরণ করার আগে যদি আপনি সুবিধামত ভুলে যান যে আপনাকে সেই পদক্ষেপটি করতে হবে তবে ডিবাগ করা খুব সহজ নয়।

এবং একটি নমুনা। দ্রষ্টব্য যে এটি পাইথন 2 বা 3 এ পুরোপুরি চলে।

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

আমি মনে করি আপনার উত্তরের জন্য আরো উপযুক্ত: stackoverflow.com/questions/45263205/...
মার্ক Cayuela Rafols

2

মুদ্রণ () এর একটি অন্তর্নির্মিত "শেষ" প্যারামিটার রয়েছে যা ডিফল্টরূপে সেট "" to n "কলিং প্রিন্ট (" এটি আমেরিকা ") আসলে প্রিন্ট কল করছে (" এটি আমেরিকা ", শেষ =" \ n ")। করার সহজ উপায় হ'ল প্রিন্ট কল করা ("এটি আমেরিকা", শেষ = "")


1

আপনি যদি অ্যারেতে মানগুলি পূর্ব-সঞ্চিত করে থাকেন তবে আপনি সেগুলি নিম্নলিখিত ফর্ম্যাটে কল করতে পারেন:

for i in range(0,n):
       print arr[i],

1

পাইথন মুদ্রণের শেষ হিসাবে নতুন লাইনে যুক্ত হয়। নিউলাইনের পরিবর্তে একটি স্থান যুক্ত করতে মুদ্রণ পদ্ধতির জন্য পাইথন 3 এর জন্য শেষ = '' ব্যবহার করুন। পাইথন 2 এর জন্য মুদ্রণ বিবৃতি শেষে কমা ব্যবহার করুন।

print("Foo",end=' ')
print('Bar')

0

এই কোওর পোস্টটি পেয়েছি , এই উদাহরণটি যা আমার পক্ষে কাজ করেছিল (অজগর 3), যা আমার এটির চেয়ে বেশি ছিল (অর্থাৎ পুরো পূর্ববর্তী লাইনটি মুছে ফেলা))

তারা যে উদাহরণ দেয়:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

একই লাইনে মুদ্রণের জন্য, অন্যরা যেমন পরামর্শ দিয়েছে, কেবল ব্যবহার করুন end=""


-2

আমি এই সমাধানটি পেয়েছি এবং এটি পাইথন ২.7 এ কাজ করছে

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

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