Làm thế nào để tôi viết đầu ra ở cùng một nơi trên bàn điều khiển?


158

Tôi chưa quen với python và đang viết một số tập lệnh để tự động tải xuống các 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ó ở cùng một vị trí, chẳng hạn như:

đầu ra:

Đang tải xuống tệp FooFile.txt [47%]

Tôi đang cố tránh điều gì đó như thế này:

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

Làm thế nào tôi nên đi về làm điều này?


Sao y : Làm thế nào tôi có thể in qua dòng hiện tại trong một ứng dụng dòng lệnh?


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

Câu trả lời:


254

Bạn cũng có thể sử dụng trả lại xe ngựa:

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

13
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ẽ trở nên xấu xí.
ephemient

5
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
scottm

19
Có thể làm điều này với nhiều dòng? Hãy nói rằng tôi có ba bản tải xuống khác nhau và tôi muốn hiển thị tiến trình của từng bản trên dòng riêng của mình.
EarlCrapstone

11
Tôi thích đặt \rở đầu dòng và thêm một \x1b[Kđể xóa văn bản trước đó.
tám

11
Có vẻ như giải pháp đơn giản nhất cho python 3 (như được đề cập trong câu trả lời bên dưới) là: print("sample text", end='\r", flush=True)
Cyrus

35

Con trăn 2

Tôi thích như sau:

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

Bản giới thiệu:

import time

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

Con trăn 3

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

Bản giới thiệu:

import time

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

Bảng điều khiển gỡ lỗi PyCharm với Python 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
sử dụng điều này cho python 3+: print ('Tải xuống tệp FooFile.txt [% d %%] \ r'% i, end = "")
hkoosha

Trên bảng điều khiển Trình gỡ lỗi PyCharm, cần phải đến trước văn bản. Mặt khác, văn bản có thể không xuất hiện ở tất cả, hoặc xuất hiện không nhất quán. Tôi đã thêm phiên bản phù hợp với tôi dưới dạng chỉnh sửa, vì tôi không thể viết mã nhiều dòng trong câu trả lời này. Tôi đặt nó trên ý chính của mình để mọi người có thể xem nó trong khi bản chỉnh sửa đang chờ phê duyệt: gist.github.com/yulkang/40168c7729a7a7b96d0116d8b1bc26df
Yul Kang

"\ r" ở cuối chuỗi hoạt động với tôi trong bảng điều khiển trình gỡ lỗi trên PyCharm 2020.1 (PyCharm 2020.1.2 (Phiên bản cộng đồng); Build # PC-201.7846.77, được xây dựng vào ngày 31 tháng 5 năm 2020).
battey


15

In ký tự backspace \bnhiều lần, sau đó ghi đè số cũ bằng số mới.


Thật thú vị, tôi đã không nghĩ làm theo cách đó.
Chris Ballance

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)
Nathan Donnellan

3
Sử dụng trả lại vận chuyển (ví dụ print 'Downloading.... \r') cũng không xóa dữ liệu trước đó, nhưng nó ngăn không cho biết sao lưu dự phòng bao xa.
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="")

Tại sao điều này tốt hơn ở trên (Tôi là Python n00b, vì vậy xin miễn cho sự thiếu hiểu biết của tôi :-))?
BalinKingOfMoria khôi phục CM

7

Đối với Python 3xx:

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

4

Một giải pháp gọn gàng đã và đang làm việc cho 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("")

Điều sys.stdout.flushnày rất quan trọng nếu không nó thực sự trở nên lộn xộn và việc print("")thoát khỏi vòng lặp cũng rất quan trọng.

CẬP NHẬT : Như đã đề cập trong các ý kiến, printcũng có một flushđối số. Vì vậy, 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 của flush=Trueđể print, do đó không cần cho thêm sys.stdout.flush()cuộc gọi.
PM 2Ring

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="")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.