2009-02-05 47 views
111

Tôi mới dùng python và đang viết một số tập lệnh để tự động tải xuống tệp từ máy chủ FTP, v.v. Tôi muốn hiển thị tiến trình tải xuống, nhưng tôi muốn nó ở vị trí tương tự, chẳng hạn như:Làm cách nào để viết đầu ra ở cùng một vị trí trên bảng điều khiển?

đầu ra:

Tải file FooFile.txt [47%]

tôi đang cố gắng để tránh một cái gì đó như thế này:

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

Tôi nên làm như thế nào?


Duplicate: How can I print over the current line in a command line application?

+1

bạn có thể quan tâm trong mô-đun dễ sử dụng này, đó là một thanh tiến trình văn bản. http://pypi.python.org/pypi/progressbar/2.2 – wim

Trả lời

188

Bạn cũng có thể sử dụng trở về vận chuyển:

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

Giải pháp rất phổ biến và đơn giản. Lưu ý: nếu dòng của bạn dài hơn chiều rộng của thiết bị đầu cuối của bạn, điều này sẽ xấu xí. – ephemient

+4

Tôi cũng đã phải thêm một cuộc gọi đến sys.stdout.flush() để con trỏ không bị trả lại khoảng – scottm

+2

Vẻ đẹp của UNIX – g33kz0r

13

In nhân vật BackSpace \b nhiều lần, và sau đó ghi đè lên số cũ với số điện thoại mới.

+0

thú vị, tôi đã không nghĩ đến việc đó theo cách đó. –

+0

Tôi thích điều này bởi vì nó không xóa các lệnh trước đó (nếu bạn có nhiều giai đoạn bạn muốn để lại trên màn hình) –

+2

Sử dụng trở về vận chuyển (ví dụ: 'in' Tải xuống .... \ r'') cũng không rõ ràng dữ liệu trước đó, nhưng nó ngăn cản việc phải biết cách quay lại sao lưu. – cod3monk3y

21

Sử dụng thư viện thiết bị đầu cuối xử lý như curses module:

Module lời nguyền cung cấp một giao diện để các thư viện lời nguyền, tiêu chuẩn de-facto cho di động THC tiên tiến.

+1

+1 để giới thiệu một mô-đun mới – pylover

+1

Không khả dụng cho Windows. –

+3

@Diego hiện có thư viện hỗ trợ cho các mô-đun curses trên Windows. xem http://stackoverflow.com/a/19851287/1426237 – Plexico

9

Tôi thích như sau:

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

Demo:

import time 

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

sử dụng này cho python 3+: in ('Tải file 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

Tại sao điều này tốt hơn so với ở trên (Tôi là một n00b Python, vì vậy xin lỗi của tôi vô minh :-))? – BalinKingOfMoria

3

Một giải pháp gọn gàng có được làm việc g đối với tôi là:

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

Các sys.stdout.flush là quan trọng nếu không nó trở nên thực sự vụng về và print("") trên cho thoát vòng lặp cũng rất quan trọng.

CẬP NHẬT: Như đã đề cập trong nhận xét, print cũng có đối số flush. Vì vậy, những điều sau đây cũng sẽ làm việc:

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

Trong Python hiện đại, bạn có thể cung cấp một arg 'flush = True' cho' print', do đó không cần thêm lệnh 'sys.stdout.flush()'. –

2

Đối với Python 3xx:

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

print ("\ r Loading ... {}". định dạng (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="") 
Các vấn đề liên quan