Saya sedang menulis pengunduh FTP. Bagian dari kode adalah seperti ini:
ftp.retrbinary("RETR " + file_name, process)
Saya memanggil proses fungsi untuk menangani panggilan balik:
def process(data):
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
file.write(data)
dan keluarannya seperti ini:
1784 KB / KB 1829 downloaded!
1788 KB / KB 1829 downloaded!
etc...
tetapi saya ingin itu mencetak baris ini dan lain kali mencetak ulang / menyegarkannya sehingga itu hanya akan menampilkannya sekali dan saya akan melihat kemajuan unduhan itu.
Bagaimana caranya?
python
refresh
progress-bar
Kristian
sumber
sumber
Jawaban:
Berikut kode untuk Python 3.x:
Kata
end=
kunci adalah yang berfungsi di sini - secara default,print()
diakhiri dengan karakter baris baru (\n
), tetapi ini dapat diganti dengan string yang berbeda. Dalam kasus ini, mengakhiri baris dengan carriage return akan mengembalikan kursor ke awal baris saat ini. Jadi, tidak perlu mengimporsys
modul untuk penggunaan sederhana semacam ini.print()
sebenarnya memiliki sejumlah argumen kata kunci yang dapat digunakan untuk menyederhanakan kode.Untuk menggunakan kode yang sama pada Python 2.6+, letakkan baris berikut di bagian atas file:
sumber
from __future__ import print_function
.print "foo",
Namun Anda masih perlu membilas setelah itu untuk melihat perubahan:sys.stdout.flush()
\r
di awal string, dan mengaturend=''
agar ini bekerja. Saya rasa terminal saya tidak suka jika saya akhiri dengan\r
flush=True
keprint()
fungsi untuk memastikan buffer memerah (garis standar penyangga hanya akan menyiram ketika\n
baris baru ditulis).\r
paling awal danend=''
bekerja paling baik dan paling lancar. Menggunakanflush=True
dengan\r
di akhir jika string danend='\r'
juga bekerja tetapi tidak mulus & menghapus garis & linefeed nya.Jika yang ingin Anda lakukan hanyalah mengubah satu baris, gunakan
\r
.\r
berarti kereta kembali. Efeknya hanya untuk menempatkan tanda sisipan kembali di awal baris saat ini. Itu tidak menghapus apapun. Demikian pula,\b
dapat digunakan untuk mundur satu karakter. (beberapa terminal mungkin tidak mendukung semua fitur tersebut)sumber
\r
berarti kereta kembali. efeknya hanya untuk meletakkan tanda sisipan kembali di awal baris saat ini. itu tidak menghapus apapun. Demikian pula,\b
dapat digunakan untuk mundur satu karakter. (beberapa terminal mungkin tidak mendukung semua fitur tersebut)sys.stdout.write('%s\r', size_str')
Saya pikir Anda bermaksudsys.stdout.write('%s\r' % size_str)
tetapi tidak berhasil.print
bukansys.stdout.write
jika Anda lebih memilih:print size_str + "\r",
bekerja dengan baik. Di,
akhir pernyataan cetak menyembunyikan baris baru;sys.stdout.flush()
masih dibutuhkanSilahkan lihat di dokumentasi kutukan modul dan kutukan HOWTO modul .
Contoh yang sangat mendasar:
sumber
clrtoeol
untuk saat baris kedua lebih pendek dari yang pertama.Inilah kelas kecil saya yang bisa mencetak ulang blok teks. Ini benar membersihkan teks sebelumnya sehingga Anda dapat menimpa teks lama Anda dengan teks baru yang lebih pendek tanpa membuat kekacauan.
sumber
Saya menemukan bahwa untuk pernyataan cetak sederhana di python 2.7, cukup beri koma di akhir setelah Anda
'\r'
.Ini lebih pendek dari solusi non-python 3 lainnya, tetapi juga lebih sulit untuk dipelihara.
sumber
Anda bisa menambahkan '\ r' di akhir string ditambah koma di akhir fungsi cetak. Sebagai contoh:
sumber
end
parameter default diatur ke\n
so u print(...)KB downloaded!\r\n
. Apakah aku salah?end = '\r'
sebagai gantinya memperbaiki masalah di Python 3.Saya menggunakan spyder 3.3.1 - windows 7 - python 3.6 meskipun mungkin tidak diperlukan flush. berdasarkan posting ini - https://github.com/spyder-ide/spyder/issues/3437
sumber
untuk menimpa baris sebelumnya di python semua yang Anda butuhkan adalah menambahkan end = '\ r' ke fungsi cetak, uji contoh ini:
sumber