Saya menulis aplikasi konsol sederhana untuk mengunggah dan mengunduh file dari server FTP menggunakan ftplib.
Saya ingin aplikasi menunjukkan visualisasi dari proses pengunduhan / pengunggahannya bagi pengguna; setiap kali sepotong data diunduh, saya ingin itu memberikan pembaruan kemajuan, bahkan jika itu hanya representasi numerik seperti persentase.
Yang penting, saya ingin menghindari menghapus semua teks yang telah dicetak ke konsol di baris sebelumnya (yaitu saya tidak ingin "menghapus" seluruh terminal saat mencetak kemajuan yang diperbarui).
Ini sepertinya tugas yang cukup umum - bagaimana saya bisa membuat progress bar atau visualisasi serupa yang menghasilkan ke konsol saya sambil menjaga keluaran program sebelumnya?
Jawaban:
Bilah Kemajuan yang Sederhana dan Dapat Disesuaikan
Berikut adalah agregat dari banyak jawaban di bawah ini yang saya gunakan secara teratur (tidak perlu impor).
Catatan: Ini untuk Python 3; lihat komentar untuk detail tentang penggunaan ini di Python 2.
Contoh Penggunaan
Output sampel:
Memperbarui
Ada diskusi dalam komentar mengenai opsi yang memungkinkan bilah kemajuan menyesuaikan secara dinamis dengan lebar jendela terminal. Meskipun saya tidak merekomendasikan ini, berikut adalah intinya yang mengimplementasikan fitur ini (dan mencatat peringatan).
sumber
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
harus diteruskan ke panjang untuk menyesuaikan ukuran bilah kemajuan ke jendela terminal. Meskipun panjang bagian progress bar harus dikurangi (dengan panjang awalan, akhiran, persen dan karakter tambahan dalam string ini'\r%s |%s| %s%% %s'
end = '\r'
untukend = ''
.Menulis 'r' akan memindahkan kursor kembali ke awal baris.
Ini menampilkan penghitung persentase:
sumber
99%
print
memilikiend
argumen: stackoverflow.com/a/8436827/1959808print
juga memilikiflush
argumen: docs.python.org/3/library/functions.html#printtqdm: tambahkan pengukur kemajuan ke loop Anda dalam sedetik :
sumber
Tulis
\r
ke konsol. Itu adalah "carriage return" yang menyebabkan semua teks setelahnya digaungkan di awal baris. Sesuatu seperti:yang akan memberi Anda sesuatu seperti:
[ ########## ] 100%
sumber
\r
dan kemudian tuliskan seluruh baris lagi. Pada dasarnya:, diprint("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
manaamtDone
float antara 0 dan 1.sys.stdout.write
daripadaprint
. Denganprint
saya mendapat baris baru.,
di akhirprint
karya untuk saya.print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
manaworkdone
adalah float antara 0 dan 1, misalnya,workdone = parsed_dirs/total_dirs
Itu kurang dari 10 baris kode.
Intinya di sini: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
sumber
Coba klik perpustakaan yang ditulis oleh Mozart dari Python, Armin Ronacher.
Untuk membuat bilah kemajuan sederhana:
Seperti inilah tampilannya:
Sesuaikan dengan isi hati Anda:
Tampilan ubahsuaian:
Bahkan ada lebih banyak opsi, lihat dokumen API :
sumber
Saya menyadari bahwa saya terlambat ke permainan, tapi inilah gaya yang sedikit Yum (Red Hat) yang saya tulis (tidak mencapai akurasi 100% di sini, tetapi jika Anda menggunakan bilah kemajuan untuk tingkat akurasi itu, maka Anda Lagi pula SALAH):
Seharusnya menghasilkan sesuatu yang tampak seperti ini:
... di mana kurung tetap diam dan hanya hash yang meningkat.
Ini mungkin bekerja lebih baik sebagai dekorator. Untuk hari lain ...
sumber
Periksa perpustakaan ini: clint
ia memiliki banyak fitur termasuk bilah kemajuan:
tautan ini menyediakan gambaran umum singkat fitur-fiturnya
sumber
Berikut adalah contoh bagus dari progressbar yang ditulis dengan Python: http://nadiana.com/animated-terminal-progress-bar-in-pythonTetapi jika Anda ingin menulisnya sendiri. Anda dapat menggunakan
curses
modul ini untuk mempermudah :)[sunting] Mungkin lebih mudah bukan kata kutukan. Tetapi jika Anda ingin membuat cui yang lengkap, kutukan akan mengurus banyak hal untuk Anda.
[Sunting] Karena tautan lama sudah mati saya telah memasang versi saya sendiri dari Python Progressbar, dapatkan di sini: https://github.com/WoLpH/python-progressbar
sumber
curses
? Lebih mudah? Hmmm ....keluaran
[29%] ===================
sumber
dan, hanya untuk menambah tumpukan, inilah objek yang bisa Anda gunakan
menghasilkan:
Ini paling sering dianggap "di atas", tetapi sangat berguna ketika Anda sering menggunakannya
sumber
Instal
tqdm
. (pip install tqdm
) Dan gunakan sebagai berikut:Itu bilah kemajuan 10 detik yang akan menampilkan sesuatu seperti ini:
sumber
Jalankan ini di baris perintah Python ( bukan di lingkungan IDE atau pengembangan apa pun):
Bekerja dengan baik pada sistem Windows saya.
sumber
Dan banyak tutorial menunggu untuk googled.
sumber
Saya menggunakan progres dari reddit . Saya suka karena dapat mencetak kemajuan untuk setiap item dalam satu baris, dan itu tidak harus menghapus cetakan dari program.
Edit: tautan tetap
sumber
Coba instal paket ini
pip install progressbar2
::progresssbar github: https://github.com/WoLpH/python-progressbar
sumber
berdasarkan jawaban di atas dan pertanyaan serupa lainnya tentang progress bar CLI, saya pikir saya mendapat jawaban umum yang umum untuk semuanya. Periksa di https://stackoverflow.com/a/15860757/2254146
Singkatnya, kodenya adalah ini:
Seperti
Persen: [##########] 99.0%
sumber
Saya sarankan menggunakan tqdm - https://pypi.python.org/pypi/tqdm - yang membuatnya mudah untuk mengubah setiap iterable atau proses menjadi bilah kemajuan, dan menangani semua masalah dengan terminal yang dibutuhkan.
Dari dokumentasi: "tqdm dapat dengan mudah mendukung panggilan balik / pengait dan pembaruan manual. Inilah contoh dengan urllib"
sumber
Solusi yang sangat sederhana adalah dengan memasukkan kode ini ke loop Anda:
Letakkan ini di badan (yaitu bagian atas) dari file Anda:
Letakkan ini di badan loop Anda:
sumber
CATATAN: jika Anda menjalankan ini dalam interepter interaktif Anda mendapatkan nomor tambahan yang dicetak
sumber
lol saya hanya menulis semuanya untuk ini, ini kode yang perlu diingat Anda tidak dapat menggunakan unicode ketika melakukan blok ascii saya menggunakan cp437
dan Anda menyebutnya seperti itu
jadi terlihat seperti ini
sumber
Dengan saran hebat di atas, saya mengerjakan bilah kemajuan.
Namun saya ingin menunjukkan beberapa kekurangan
Setiap kali progress bar memerah, itu akan mulai pada baris baru
seperti ini:
[] 0%
[#] 10%
[##] 20%
[###] 30%
2. kurung siku ']' dan angka persen di sisi kanan bergeser ke kanan saat '###' bertambah panjang.
3. Kesalahan akan terjadi jika ekspresi 'progress / 10' tidak dapat mengembalikan integer.
Dan kode berikut akan memperbaiki masalah di atas.
sumber
Kode untuk bilah progres terminal python
sumber
saya menulis progressbar sederhana:
seperti yang Anda lihat, ada: panjang bilah, awalan dan akhiran, pengisi, spasi, teks dalam bilah pada 100% (oncomp) dan batas
berikut sebuah contoh:
sedang dalam proses:
keluar lengkap:
sumber
Menyusun beberapa ide yang saya temukan di sini, dan menambahkan perkiraan waktu yang tersisa:
sumber
Untuk python 3:
sumber
Nah berikut ini adalah kode yang berfungsi dan saya mengujinya sebelum memposting:
Pro:
Cons:
prog2 = prog/5
menjadiprog2 = int(prog/5)
)sumber
Inilah solusi Python 3 saya:
'\ b' adalah garis miring terbalik, untuk setiap karakter dalam string Anda. Ini tidak berfungsi di dalam jendela cmd Windows.
sumber
fungsi dari Greenstick untuk 2.7:
sumber
Modul python progressbar adalah pilihan yang bagus. Ini kode khas saya:
sumber