मैं कंसोल पर एक ही स्थान पर आउटपुट कैसे लिखूं?


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
क्या कई लाइनों के साथ ऐसा करना संभव है? कहते हैं कि मेरे पास तीन अलग-अलग डाउनलोड हैं, और मैं प्रत्येक की प्रगति को अपनी लाइन पर दिखाना चाहता हूं।
EarlCrapstone

11
मुझे \rलाइन की शुरुआत में रखना पसंद है , और \x1b[Kपिछले पाठ को साफ़ करने के लिए एक जोड़ना है ।
अगस्तुर

11
यह अजगर 3 के लिए सबसे सरल समाधान जैसा लगता है (जैसा कि नीचे दिए गए जवाबों में उल्लेख किया गया है) है: print("sample text", end='\r", flush=True)
साइरस

35

अजगर २

मुझे निम्नलिखित पसंद है:

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 के साथ PyCharm डिबगर कंसोल

# 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

PyCharm डीबगर कंसोल पर, टेक्स्ट से पहले \ r को आने की आवश्यकता है। अन्यथा, पाठ बिल्कुल दिखाई नहीं दे सकता है, या असंगत रूप से प्रकट हो सकता है। मैंने उस संस्करण को जोड़ा जो मेरे लिए एक एडिट का काम करता है, क्योंकि मैं इस उत्तर में मल्टी-लाइन कोड नहीं लिख सकता था। : मैं तो लोग उसे देख सकें मेरी सार पर डाल दिया, जबकि संपादित मंजूरी का इंतजार है gist.github.com/yulkang/40168c7729a7a7b96d0116d8b1bc26df
युल कांग

स्ट्रिंग के अंत में "ए आर" मेरे लिए PyCharm 2020.1 (PyCharm 2020.1.2 (कम्यूनिटी एडिशन) पर डीबगर कंसोल में काम करता है; 31 मई, 2020 को बनाया गया # PC-201.7846.77;)।
बैटी

28

शाप मॉड्यूल की तरह टर्मिनल-हैंडलिंग लाइब्रेरी का उपयोग करें :

शाप मॉड्यूल शाप पुस्तकालय, पोर्टेबल उन्नत टर्मिनल हैंडलिंग के लिए वास्तविक मानक के लिए एक इंटरफ़ेस प्रदान करता है।


1
विंडोज के लिए उपलब्ध नहीं है।
डिएगो हेरानज़

3
@Diego अब विंडोज पर शाप मॉड्यूल के लिए एक समर्थन पुस्तकालय है। देखें stackoverflow.com/a/19851287/1426237
Plexico

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="")

यह ऊपर से बेहतर क्यों है (मैं एक अजगर n00b हूँ, इसलिए कृपया मेरी अज्ञानता बहाना :-))?
BalinKingOfMoria CMs

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=Trueto की आपूर्ति कर सकते हैं print, इसलिए अतिरिक्त sys.stdout.flush()कॉल की कोई आवश्यकता नहीं है ।
PM 2Ring

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.