আমি কনসোলে একই জায়গায় আউটপুট কীভাবে লিখব?


158

আমি অজগর থেকে নতুন এবং এফটিপি সার্ভারগুলি থেকে ফাইল ডাউনলোড করতে স্বয়ংক্রিয় করতে কিছু স্ক্রিপ্ট লিখছি ইত্যাদি ডাউনলোডের অগ্রগতিটি দেখাতে চাই, তবে আমি এটি একই অবস্থানে থাকতে চাই যেমন:

আউটপুট:

ফাইল ডাউনলোড করা হচ্ছে FooFile.txt [47%]

আমি এই জাতীয় কিছু এড়াতে চেষ্টা করছি:

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]

এই কাজটি করা সম্পর্কে আমার কীভাবে যাওয়া উচিত?


সদৃশ : কমান্ড লাইন অ্যাপ্লিকেশনটিতে আমি কীভাবে বর্তমান লাইনে মুদ্রণ করতে পারি?


1
আপনি সহজেই ব্যবহারযোগ্য এই মডিউলটিতে আগ্রহী হতে পারেন, এটি একটি পাঠ্য অগ্রগতি বার। pypi.python.org/pypi/progressbar/2.2
wim

উত্তর:


254

আপনি গাড়ীর রিটার্নও ব্যবহার করতে পারেন:

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()

13
খুব সাধারণ এবং সহজ সমাধান। দ্রষ্টব্য: যদি আপনার লাইনটি আপনার টার্মিনালের প্রস্থের চেয়ে দীর্ঘ হয় তবে এটি কুরুচিপূর্ণ হয়।
মহিমান্বিত

5
আমাকে sys.stdout.flush () এ একটি কলও যুক্ত করতে হয়েছিল যাতে কার্সারটি চারদিকে বাউন্স না করে
স্কটম

19
একাধিক লাইন দিয়ে এটি করা কি সম্ভব? বলি আমার তিনটি আলাদা ডাউনলোড রয়েছে এবং আমি প্রত্যেকটির অগ্রগতি তার নিজস্ব লাইনে দেখাতে চাই।
আর্লক্র্যাপস্টোন

11
আমি \rলাইনের প্রারম্ভে লাগাতে চাই এবং \x1b[Kপূর্ববর্তী পাঠ্যটি সাফ করার জন্য একটি যুক্ত করতে চাই।
augurar

11
এটা তোলে পাইথন 3 (নিচে উত্তর হিসাবে উল্লেখ করেছে) এর জন্য সবচেয়ে সহজ সমাধান মত মনে হয় হল: print("sample text", end='\r", flush=True)
সাইরাস

35

পাইথন 2

আমি নিম্নলিখিত পছন্দ:

print 'Downloading File FooFile.txt [%d%%]\r'%i,

ডেমো:

import time

for i in range(100):
    time.sleep(0.1)
    print 'Downloading File FooFile.txt [%d%%]\r'%i,

পাইথন ঘ

print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

ডেমো:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

পাইথন 3 এর সাথে পাইচর্ম ডিবাগার কনসোল

# On PyCharm Debugger console, \r needs to come before the text.
# Otherwise, the text may not appear at all, or appear inconsistently.
# tested on PyCharm 2019.3, Python 3.6

import time

print('Start.')
for i in range(100):
    time.sleep(0.02)
    print('\rDownloading File FooFile.txt [%d%%]'%i, end="")
print('\nDone.')

9
অজগর 3+ এর জন্য এটি ব্যবহার করুন: মুদ্রণ করুন ('ফাইল ডাউনলোড FooFile.txt [% d %%] \ r'% i, শেষ = "")
hkoosha

পাইচার্ম ডিবাগার কনসোলে, পাঠ্যের আগে come r আসা উচিত। অন্যথায়, পাঠ্যটি একেবারে উপস্থিত না হতে পারে, বা অসম্পূর্ণভাবে উপস্থিত হতে পারে। আমি সম্পাদনা হিসাবে আমার জন্য কাজ করে এমন সংস্করণটি যুক্ত করেছি, কারণ আমি এই উত্তরে মাল্টি-লাইন কোডটি লিখতে পারি নি। আমি এটি আমার সংক্ষেপে রেখেছি
ইউল কাং

স্ট্রিংয়ের শেষে "\ r" পাইচার্ম 2020.1 (পাইচার্ম 2020.1.2 (সম্প্রদায় সংস্করণ); বিল্ড # পিসি -201.7846.77, 31 মে, 2020 এ নির্মিত) এর ডিবাগার কনসোলে আমার জন্য কাজ করে।
বাটিতে

28

কার্পস মডিউলের মতো একটি টার্মিনাল হ্যান্ডলিং লাইব্রেরি ব্যবহার করুন :

কার্পস মডিউলটি শাপের পাঠাগারটিতে একটি ইন্টারফেস সরবরাহ করে, বহনযোগ্য উন্নত টার্মিনাল হ্যান্ডলিংয়ের জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড।


1
উইন্ডোজ জন্য উপলব্ধ নয়।
দিয়েগো হেরানজ

3
@ ডিগো এখন উইন্ডোজে শাপের মডিউলটির জন্য একটি সমর্থন পাঠাগার রয়েছে। স্ট্যাকওভারফ্লো
19851287/

15

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


আকর্ষণীয়, আমি এটি সেভাবে করার কথা ভাবিনি।
ক্রিস বাল্যান্স

আমি এটি পছন্দ করি কারণ এটি পূর্ববর্তী কমান্ডগুলি সাফ করে না (যদি আপনার একাধিক পর্যায় থাকে আপনি পর্দায় ছেড়ে যেতে চান)
নাথন ডোনাল্লান

3
ক্যারিজের রিটার্ন (উদাহরণস্বরূপ print 'Downloading.... \r') ব্যবহার করাও পূর্ববর্তী ডেটা সাফ করে না, তবে এটি কতটা ব্যাক আপ করতে হবে তা জানতে বাধা দেয়।
cod3monk3y

8
#kinda like the one above but better :P

from __future__ import print_function
from time import sleep

for i in range(101):
  str1="Downloading File FooFile.txt [{}%]".format(i)
  back="\b"*len(str1)
  print(str1, end="")
  sleep(0.1)
  print(back, end="")

কেন এটি উপরের চেয়ে ভাল (আমি পাইথন এন 100 বি, তাই দয়া করে আমার অজানাটি ক্ষমা করুন :-))?
বালিনকিংঅফ মরিয়া

7

পাইথন 3xx এর জন্য:

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")

4

একটি ঝরঝরে সমাধান যা আমার জন্য কাজ করে চলেছে তা হ'ল:

from __future__ import print_function
import sys
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r')
    sys.stdout.flush()
print("")

sys.stdout.flushঅন্যথায় এটা সত্যিই ক্লাঙ্কি পায় এবং গুরুত্বপূর্ণ print("")লুপ প্রস্থান জন্য গুরুত্বপূর্ণ।

আপডেট : মন্তব্যগুলিতে উল্লিখিত হিসাবে, printএকটি flushযুক্তি আছে। সুতরাং নিম্নলিখিতগুলিও কাজ করবে:

from __future__ import print_function
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r', flush=True)
print("")

1
আধুনিক পাইথন, আপনি একজন ARG সরবরাহ করতে পারে flush=Trueথেকে print, তাই অতিরিক্ত জন্য কোন প্রয়োজন নেই sys.stdout.flush()কল।
পিএম 2 রিং

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