একই লাইনে মুদ্রণ এবং একটি নতুন লাইন না?


89

মূলত আমি এই লোকটি যা করেছে তার বিপরীতে করতে চাই ... হি।

পাইথন স্ক্রিপ্ট: প্রতিটি লাইনে বিদ্যমান লাইনটি আপডেট করার পরিবর্তে শেল করতে নতুন লাইন মুদ্রণ করুন

আমার একটি প্রোগ্রাম রয়েছে যা আমাকে বলছে এটি কতটা দূরে।

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete"

সুতরাং যদি লেন (কিছু_ তালিকা) 50 হয়, আমি শেষ লাইনটি 50 বার মুদ্রিত করব। আমি একটি লাইন মুদ্রণ করতে চাই এবং সেই লাইনটি আপডেট করে রাখতে চাই। আমি জানি আমি জানি এটি সম্ভবত সবচেয়ে খোঁড়া প্রশ্ন যা আপনি সারা দিন পড়বেন। উত্তর পাওয়ার জন্য গুগলে আমার যে চারটি শব্দ ব্যবহার করা দরকার তা কেবল আমিই বুঝতে পারি না।

হালনাগাদ! আমি এমভিডিএসের পরামর্শটি চেষ্টা করেছিলাম যা ঠিক আছে। নতুন কোড

print percent_complete,"           \r",

শতকরা সম্পূর্ণটি কেবল একটি স্ট্রিং (আমি প্রথমবার আক্ষরিক হয়ে উঠার চেষ্টা করছিলাম তবে আমি আক্ষরিক হওয়ার চেষ্টা করছিলাম)। ফলস্বরূপ এখন এটি প্রোগ্রামটি চালায়, প্রোগ্রামটি শেষ হওয়ার আগ পর্যন্ত কোনও কিছুই মুদ্রণ করে না এবং তারপরে একটি এবং কেবল একটি লাইনে "100 শতাংশ সম্পূর্ণ" মুদ্রণ করে।

ক্যারিজ রিটার্ন ব্যতীত (তবে কমা সহ, এমভিডিসের অর্ধেক পরামর্শ) শেষ পর্যন্ত কিছুই মুদ্রণ করে না। এবং তারপরে প্রিন্ট করুন:

0 percent complete     2 percent complete     3 percent complete     4 percent complete    

ইত্যাদি। সুতরাং এখন নতুন সমস্যাটি কমা দিয়ে প্রোগ্রামটি শেষ না হওয়া পর্যন্ত এটি মুদ্রণ করবে না।

ক্যারেজ রিটার্ন এবং কোনও কমা দিয়ে এটি দুজনের মতোই হুবহু আচরণ করে।


আপনি এটিও পরীক্ষা করতে চাইতে পারেন sys.stdout.isatty()যাতে টার্মিনালে না চলাকালীন আপনি এই জিনিসগুলিকে থুতু না ফেলে।
এমভিডিএস

আমি এটি টার্মিনাল থেকে চালাচ্ছি ... যদিও ভাল চিন্তা আছে। আমি নিশ্চিত যে আমি এটি এক পর্যায়ে প্রয়োজন।
ক্রিসকলে

4
পটভূমিটি, বিটিডব্লিউ, যে বেশ কয়েকটি ভাষায় \ n (যা আমরা এখন বাদ দিই) স্টডআউটে ফ্লাশ করার জন্য একটি অন্তর্নিহিত সংকেত হিসাবে কাজ করে। অন্যথায় অনেক লোক বিভ্রান্ত হবে।
এমভিডিএস

উত্তর:


86

একে বলা হয় গাড়ী চালা, বা \r

ব্যবহার

print i/len(some_list)*100," percent complete         \r",

কমা মুদ্রণটিকে একটি নতুন লাইন যুক্ত করতে বাধা দেয়। (এবং স্পেসগুলি পূর্বের আউটপুট থেকে লাইন পরিষ্কার রাখবে)

এছাড়াও, print ""কমপক্ষে একটি চূড়ান্তভাবে নতুন চূড়ান্ত করার জন্য নতুন লাইনের সাথে শেষ করতে ভুলবেন না !


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

এত কাছে ... আমি এর ফলাফল দিয়ে প্রশ্ন আপডেট করব।
ক্রিসকলে

4
@ ডাস্টিনিচোস: হেই, সেই বলি সম্পর্কে ভুলে গেছি। পাইথন আউটপুট বাফারিংয়ের প্রশ্নটি দেখুন: স্ট্যাকওভারফ্লো
নিকোলাস নাইট

4
@ ডাস্টিনিচোস: (বা প্রতিটি প্রিন্ট কলের পরে কেবলমাত্র সিস.স্টডআউট.ফ্লুশ () ব্যবহার করুন, যদি আপনি আপনার প্রোগ্রামের বাকি অংশের জন্য আউটপুট বাফারিংয়ের বিষয়ে চিন্তা না করেন তবে এটি আরও ভাল হতে পারে)
নিকোলাস নাইট

4
এটি আমার পক্ষে কাজ করে না আমি আসলে এটি বহুবার চেষ্টা করেছি এবং এটি কখনই আমার পক্ষে কার্যকর হয়নি। আমি ম্যাকের উপর আইটার্ম 2 ব্যবহার করছি তবে আমি বেশিরভাগ সময় একটি লিনাক্স সার্ভারে প্রবেশ করবো। এটি করার মতো কোনও কাজ আমি খুঁজে পাইনি যা আসলে কাজ করে।
বুগেনচেল

33

পাইথন ৩.x থেকে আপনি এটি করতে পারেন:

print('bla bla', end='')

(যা from __future__ import print_functionআপনার স্ক্রিপ্ট / মডিউলের শীর্ষে রেখে পাইথন ২.6 বা ২.7 এও ব্যবহার করা যেতে পারে )

পাইথন কনসোল প্রগতিবার উদাহরণ:

import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    n=0
    while n<total:
        done = '#'*(n+1)
        todo = '-'*(total-n-1)
        s = '<{0}>'.format(done+todo)
        if not todo:
            s+='\n'        
        if n>0:
            s = '\r'+s
        print(s, end='')
        yield n
        n+=1

# example for use of status generator
for i in range_with_status(10):
    time.sleep(0.1)

R পাশাপাশি একটি নতুন লাইন যুক্ত হতে দেখা গেছে
fccoelho

4
এটি নিউলাইন থেকে মুক্তি পেয়েছে, তবে ওভাররাইটিংয়ের অনুমতি দেয় না, যা আমি মনে করি লেখক যা চান তা তাই।
বিগেনচেল

4
@ বুগেনচেল '\ আর' দিয়ে ব্যবহার করেছেন (কোডের নমুনায় যেমন) ওপি যা চায় ঠিক তা করে
মিলো উইলোনডেক

33

আমার জন্য, যা কাজ করেছিল তা ছিল রেমি এবং সিরিউসডের জবাবগুলির একটি কম্বো:

from __future__ import print_function
import sys

print(str, end='\r')
sys.stdout.flush()

পুরানো .. পাইথন হিসাবে আমার কাছে 3.8.5 কেবল এটিই কাজ করে: মুদ্রণ ("কিছু স্ট্রিং", শেষ = '\ r')
rroger

23

পাইথন ৩.৩+ এ আপনার দরকার নেই sys.stdout.flush()print(string, end='', flush=True)কাজ করে।

তাই

print('foo', end='')
print('\rbar', end='', flush=True)

'বার' দিয়ে 'ফু' ওভাররাইট করবে।


4
এটি কাজ করে, তবে মুদ্রিত পাঠ্যটি a দিয়ে শেষ হয় "\r"
bli

13

কনসোলের জন্য আপনার সম্ভবত দরকার হবে

sys.stdout.flush()

আপডেট জোর করা। আমি মনে করি ,প্রিন্টে ব্যবহার স্টাডাউটকে ফ্লাশিং থেকে ব্লক করবে এবং কোনওভাবে এটি আপডেট হবে না


টার্মিনেটর আমার জন্য প্রিন্ট ("...", শেষ = '' r ') ব্যবহার করার সময় প্রতি 30 সেকেন্ডের মধ্যে কেবলমাত্র লাইনটি রিফ্রেশ করে যাচ্ছিল যদি না আমি মুদ্রণ বিবরণের পরে অবিলম্বে এই কমান্ডটি না চালাই। ধন্যবাদ
ব্রাইস গিন্টা

4

গেমটি দেরিতে - তবে যেহেতু উত্তরগুলির কোনওোটাই আমার পক্ষে কাজ করেনি (আমি সেগুলি সব চেষ্টা করি নি) এবং আমি আমার অনুসন্ধানে একাধিকবার এই উত্তরটি নিয়ে এসেছি ... পাইথন 3 এ, এই সমাধানটি বেশ মার্জিত এবং আমি বিশ্বাস করি যে লেখক যা খুঁজছেন ঠিক তাই করে, এটি একই লাইনে একটি বিবৃতি আপডেট করে। দ্রষ্টব্য, লাইনটি বড় হওয়ার পরিবর্তে সঙ্কুচিত হলে আপনাকে বিশেষ কিছু করতে হতে পারে (যেমন সম্ভবত প্যাডগুলি ফাঁকা স্থানগুলির সাথে স্ট্রিংটির একটি নির্দিষ্ট দৈর্ঘ্য তৈরি করুন)

if __name__ == '__main__':
    for i in range(100):
        print("", end=f"\rPercentComplete: {i} %")
        time.sleep(0.2)

4
অজগর জন্য সবচেয়ে সহজ এবং পরিষ্কার বিকল্প => 3.6
ডেভআর

3

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

import time
f = '%4i %%'
len_to_clear = len(f)+1
clear = '\x08'* len_to_clear
print 'Progress in percent:'+' '*(len_to_clear),
for i in range(123):
    print clear+f % (i*100//123),
    time.sleep(0.4)
raw_input('\nDone')

2
import time
import sys


def update_pct(w_str):
    w_str = str(w_str)
    sys.stdout.write("\b" * len(w_str))
    sys.stdout.write(" " * len(w_str))
    sys.stdout.write("\b" * len(w_str))
    sys.stdout.write(w_str)
    sys.stdout.flush()

for pct in range(0, 101):
    update_pct("{n}%".format(n=str(pct)))
    time.sleep(0.1)

\bকার্সারের অবস্থানটি একটি জায়গায় ফিরে যাবে,
সুতরাং আমরা এটিকে আবার লাইনের শুরুতে সরিয়ে
নিয়েছি তারপরে বর্তমান লাইনটি সাফ করার জন্য স্পেস লিখি - যেমন আমরা স্পেস লিখি কার্সর এক / পাশ দিয়ে এগিয়ে চলেছে
তখন আমাদের কাছে আছে আমাদের নতুন ডেটা লেখার আগে লাইনের শুরুতে কার্সারটি আবার সরিয়ে নেওয়া

পাইথন ২.7 ব্যবহার করে উইন্ডোজ সেন্টিমিডে পরীক্ষিত


1

এটির মতো চেষ্টা করুন:

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete",

(শেষে কমা সহ।)


এটি কেবলমাত্র পুরাতন (কার্যকরীভাবে অনুরূপ তবে কুরুচিপূর্ণ) সাথে নতুন পাঠ্য সংযোজন করেছে।
ক্রিসকলে

1

আপনি যদি স্পাইডার ব্যবহার করে থাকেন তবে লাইনগুলি পূর্ববর্তী সমস্ত সমাধানগুলি দিয়ে কেবল অবিচ্ছিন্নভাবে মুদ্রণ করে। এটি এড়ানোর একটি উপায় ব্যবহার করা হচ্ছে:

for i in range(1000):
    print('\r' + str(round(i/len(df)*100,1)) + '% complete', end='')
    sys.stdout.flush()

এটি ছিল আমার জন্য একমাত্র কার্যকরী সমাধান (পাইথন ৩.৮, উইন্ডোজ, পাইচার্ম)।
z33k


0

এটি ব্যবহারের জন্য রেমি উত্তরের উপর ভিত্তি করে Python 2.7+:

from __future__ import print_function
import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    import sys
    n = 0
    while n < total:
        done = '#' * (n + 1)
        todo = '-' * (total - n - 1)
        s = '<{0}>'.format(done + todo)
        if not todo:
            s += '\n'
        if n > 0:
            s = '\r' + s
        print(s, end='\r')
        sys.stdout.flush()
        yield n
        n += 1


# example for use of status generator
for i in range_with_status(50):
    time.sleep(0.2)

0

ন্যায়বিচারের চেয়ে Python 3.6+এবং কারও listপক্ষেওintআপনার কনসোল উইন্ডোটির পুরো প্রস্থ এবং কোনও নতুন লাইনে অতিক্রম না করার এর যে কোনওটির জন্য, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

দ্রষ্টব্য: দয়া করে অবহিত করুন, ফাংশনটি get_console_with()কেবল লিনাক্স ভিত্তিক সিস্টেমে কাজ করবে এবং যেমন উইন্ডোতে কাজ করার জন্য আপনাকে এটি পুনরায় লিখতে হবে।

import os
import time

def get_console_width():
    """Returns the width of console.

    NOTE: The below implementation works only on Linux-based operating systems.
    If you wish to use it on another OS, please make sure to modify it appropriately.
    """
    return int(os.popen('stty size', 'r').read().split()[1])


def range_with_progress(list_of_elements):
    """Iterate through list with a progress bar shown in console."""

    # Get the total number of elements of the given list.
    total = len(list_of_elements)
    # Get the width of currently used console. Subtract 2 from the value for the
    # edge characters "[" and "]"
    max_width = get_console_width() - 2
    # Start iterating over the list.
    for index, element in enumerate(list_of_elements):
        # Compute how many characters should be printed as "done". It is simply
        # a percentage of work done multiplied by the width of the console. That
        # is: if we're on element 50 out of 100, that means we're 50% done, or
        # 0.5, and we should mark half of the entire console as "done".
        done = int(index / total * max_width)
        # Whatever is left, should be printed as "unfinished"
        remaining = max_width - done
        # Print to the console.
        print(f'[{done * "#"}{remaining * "."}]', end='\r')
        # yield the element to work with it
        yield element
    # Finally, print the full line. If you wish, you can also print whitespace
    # so that the progress bar disappears once you are done. In that case do not
    # forget to add the "end" parameter to print function.
    print(f'[{max_width * "#"}]')


if __name__ == '__main__':
    list_of_elements = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
    for e in range_with_progress(list_of_elements):
        time.sleep(0.2)


0

আপনি যদি পাইথন 3 ব্যবহার করেন তবে এটি আপনার পক্ষে এবং এটি সত্যিই কার্যকর।

print(value , sep='',end ='', file = sys.stdout , flush = False)

0

একটি কাউন্টডাউন দেখানোর জন্য কেবল এটি আমার নিজের দ্বারা বের করা হয়েছে তবে এটি শতাংশের জন্যও কাজ করবে।

import time
#Number of seconds to wait
i=15
#Until seconds has reached zero
while i > -1:
    #Ensure string overwrites the previous line by adding spaces at end
    print("\r{} seconds left.   ".format(i),end='')
        time.sleep(1)
        i-=1
    print("") #Adds newline after it's done

যতক্ষণ '/ r' এর পরে যা আসে তা পূর্ববর্তী স্ট্রিংয়ের চেয়ে একই দৈর্ঘ্য বা দীর্ঘ (স্পেস সহ) দীর্ঘ হয়, এটি একই লাইনে ওভাররাইট করে। আপনি নিশ্চিত করুন যে আপনি শেষ = '' অন্তর্ভুক্ত করেছেন অন্যথায় এটি একটি নতুন লাইনে মুদ্রণ করবে। আশা করি এইটি কাজ করবে!


0

"পেগা" অবজেক্টের জন্য যা স্টার্টরানিং (), স্টপরানিং (), বুলিয়ান getIsRunning () এবং পূর্ণসংখ্যা getProgress100 () 0 থেকে 100 এর মধ্যে প্রদান করে, এটি চলমান অবস্থায় পাঠ্য অগ্রগতি বার সরবরাহ করে ...

now = time.time()
timeout = now + 30.0
last_progress = -1

pega.StartRunning()

while now < timeout and pega.getIsRunning():
    time.sleep(0.5)
    now = time.time()

    progress = pega.getTubProgress100()
    if progress != last_progress:
        print('\r'+'='*progress+'-'*(100-progress)+' ' + str(progress) + "% ", end='', flush=True)
        last_progress = progress

pega.StopRunning()

progress = pega.getTubProgress100()
print('\r'+'='*progress+'-'*(100-progress)+' ' + str(progress) + "% ", flush=True)

0

2020 এর শেষে এবং পাইথন 3.8.5 আমার কাছে লিনাক্স কনসোলে কেবল এটি কাজ করে:

print('some string', end='\r')

ক্রেডিট যায়: এই পোস্ট

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