2009-02-05 15 views
111

मैं अजगर के लिए नया हूं और एफ़टीपी सर्वर से फ़ाइलों को डाउनलोड करने के लिए कुछ स्क्रिप्ट लिख रहा हूं, आदि। मैं डाउनलोड की प्रगति दिखाना चाहता हूं, लेकिन मैं इसे उसी स्थिति में रखना चाहता हूं, जैसे:मैं कंसोल पर एक ही स्थान पर आउटपुट कैसे लिखूं?

उत्पादन:

डाउनलोडिंग फ़ाइल FooFile.txt [47%]

मैं कुछ इस तरह से बचने के लिए कोशिश कर रहा हूँ:

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

मुझे यह करने के बारे में कैसे जाना चाहिए?


डुप्लिकेट: How can I print over the current line in a command line application?

+1

आप इस आसान से उपयोग मॉड्यूल में रुचि हो सकती है, यह एक पाठ प्रगति बार है। http://pypi.python.org/pypi/progressbar/2.2 – wim

उत्तर

188

तुम भी गाड़ी वापसी का उपयोग कर सकते हैं:

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

देखें बहुत आम और सरल समाधान। नोट: यदि आपकी लाइन आपके टर्मिनल की चौड़ाई से अधिक लंबी है, तो यह बदसूरत हो जाती है। – ephemient

+4

मुझे sys.stdout.flush() में भी एक कॉल जोड़ना पड़ा ताकि कर्सर – scottm

+2

के आसपास उछाल न सके यूनिक्स – g33kz0r

13

प्रिंट बैकस्पेस चरित्र \b कई बार, और फिर नए नंबर के साथ पुराने नंबर के ऊपर लिख।

+0

दिलचस्प, मैंने ऐसा करने के बारे में सोचा नहीं था। –

+0

मुझे यह पसंद है क्योंकि यह पिछले आदेशों को साफ़ नहीं करता है (यदि आपके पास स्क्रीन पर छोड़ने के लिए कई चरण हैं) –

+2

कैरिज रिटर्न का उपयोग करना (उदाहरण के लिए 'प्रिंट' डाउनलोड करना .... \ r'') भी स्पष्ट नहीं है पिछले डेटा, लेकिन यह जानना बंद कर देता है कि बैक अप कितनी दूर है। – cod3monk3y

21

उपयोग curses module की तरह एक टर्मिनल से निपटने पुस्तकालय:

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

+1

+1 एक नया मॉड्यूल पेश करने के लिए – pylover

+1

विंडोज के लिए उपलब्ध नहीं है। –

+3

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

9

मैं निम्नलिखित की तरह:

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, 
+5

पायथन 3+: प्रिंट (' फ़ाइल FooFile.txt [% d %%] \ r '% डाउनलोड करने के लिए इसका उपयोग करें I , end = "") – loolooyyyy

7
#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="") 
+0

यह उपर्युक्त से बेहतर क्यों है (मैं पाइथन एन 00 बी हूं, इसलिए कृपया मेरी अज्ञानता से बहाना :-))? – BalinKingOfMoria

3

एक स्वच्छ समाधान है कि काम कर रहा है मेरे लिए छ है:

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

आधुनिक पायथन में, आप 'flush = True' के ' प्रिंट', इसलिए अतिरिक्त 'sys.stdout.flush() 'कॉल की आवश्यकता नहीं है। –

2

अजगर 3xx के लिए:

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

प्रिंट (" \ r लोड हो रहा है ... {} "। प्रारूप (i), end =" ") – omasoud

0
x="A Sting {}" 
    for i in range(0,1000000): 
y=list(x.format(i)) 
print(x.format(i),end="") 

for j in range(0,len(y)): 
    print("\b",end="") 
संबंधित मुद्दे