Napisałem prostą aplikację konsolową do przesyłania i pobierania plików z serwera FTP za pomocą ftplib.
Chciałbym, aby aplikacja wyświetlała użytkownikowi wizualizację postępu pobierania / wysyłania; za każdym razem, gdy pobierany jest fragment danych, chciałbym, aby zapewniał on aktualizację postępu, nawet jeśli jest to tylko reprezentacja liczbowa jak procent.
Co ważne, chcę uniknąć kasowania całego tekstu, który został wydrukowany na konsoli w poprzednich liniach (tj. Nie chcę „wyczyścić” całego terminalu podczas drukowania zaktualizowanego postępu).
Wydaje się to dość powszechnym zadaniem - jak mogę zrobić pasek postępu lub podobną wizualizację, która wyświetla się na mojej konsoli, zachowując dane wyjściowe programu?
Odpowiedzi:
Prosty, konfigurowalny pasek postępu
Oto podsumowanie wielu poniższych odpowiedzi, z których regularnie korzystam (import nie jest wymagany).
Uwaga: dotyczy Python 3; zobacz komentarze, aby uzyskać szczegółowe informacje na temat korzystania z tego w Python 2.
Przykładowe użycie
Przykładowe dane wyjściowe:
Aktualizacja
W komentarzach była dyskusja na temat opcji, która pozwala dynamicznie dostosowywać pasek postępu do szerokości okna terminala. Chociaż nie polecam tego, oto podstawa, która implementuje tę funkcję (i zwraca uwagę na zastrzeżenia).
źródło
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
powinna zostać przekazana na długość, aby dostosować rozmiar paska postępu do okna terminala. Chociaż długość postępującej części taktu powinna zostać zmniejszona (o długość prefiksu, sufiksu, procentu i dodatkowych znaków w tym ciągu'\r%s |%s| %s%% %s'
end = '\r'
naend = ''
.Pisanie „\ r” spowoduje przesunięcie kursora z powrotem na początek linii.
Wyświetla licznik procentowy:
źródło
99%
print
maend
argument: stackoverflow.com/a/8436827/1959808print
ma takżeflush
argument: docs.python.org/3/library/functions.html#printtqdm: dodaj wskaźnik postępu do swoich pętli w sekundę :
źródło
Napisz
\r
do konsoli. Jest to „powrót karetki”, który powoduje, że cały tekst jest powtarzany na początku wiersza. Coś jak:co da ci coś takiego:
[ ########## ] 100%
źródło
\r
a następnie napisz całą linię ponownie. Zasadniczo:print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
gdzie liczbaamtDone
zmiennoprzecinkowa wynosi od 0 do 1.sys.stdout.write
niżprint
. Zprint
mam nowe linie.,
na końcuprint
prac.print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
gdzie liczbaworkdone
zmiennoprzecinkowa wynosi od 0 do 1, np.workdone = parsed_dirs/total_dirs
Jest mniej niż 10 linii kodu.
Istota tutaj: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
źródło
Wypróbuj bibliotekę kliknięć napisaną przez Mozarta z Python, Armin Ronacher.
Aby utworzyć prosty pasek postępu:
Tak to wygląda:
Dostosuj do swoich serc:
Niestandardowy wygląd:
Jest jeszcze więcej opcji, zobacz dokumentację API :
źródło
Zdaję sobie sprawę, że spóźniłem się na grę, ale tutaj napisałem nieco w stylu Yum (Red Hat), który napisałem (nie dążąc do 100% dokładności, ale jeśli używasz paska postępu dla tego poziomu dokładności, to i tak są NIEPRAWIDŁOWE):
Powinny produkować coś takiego:
... gdzie wsporniki pozostają nieruchome, a tylko krzyki rosną.
To może działać lepiej jako dekorator. Na kolejny dzień ...
źródło
Sprawdź tę bibliotekę: clint
ma wiele funkcji, w tym pasek postępu:
ten link zapewnia szybki przegląd jego funkcji
źródło
Oto ładny przykład paska postępu napisanego w Pythonie: http://nadiana.com/animated-terminal-progress-bar-in-pythonAle jeśli chcesz to napisać sam. Możesz użyć
curses
modułu, aby ułatwić sobie życie :)[edytuj] Być może łatwiejsze nie jest słowo na przekleństwa. Ale jeśli chcesz stworzyć pełnowymiarowe cui, przekleństwa zajmą się wieloma sprawami.
[edytuj] Ponieważ stary link jest martwy, uruchomiłem własną wersję paska postępu Pythona, pobierz go tutaj: https://github.com/WoLpH/python-progressbar
źródło
curses
? Łatwiej? Hmmm ....wynik
[29%] ===================
źródło
i, aby dodać do stosu, oto obiekt, którego możesz użyć
prowadzi do:
Najczęściej uważa się to za „przesadne”, ale jest to przydatne, gdy często go używasz
źródło
Zainstaluj
tqdm
. (pip install tqdm
) I użyj go w następujący sposób:To 10-sekundowy pasek postępu, który wyświetli coś takiego:
źródło
Uruchom to w wierszu polecenia Python ( nie w żadnym środowisku IDE ani środowisku programistycznym):
Działa dobrze w moim systemie Windows.
źródło
I wiele samouczków, które czekają na google.
źródło
Korzystam z postępu od reddit . Podoba mi się, ponieważ może drukować postęp dla każdego elementu w jednym wierszu i nie powinien usuwać wydruków z programu.
Edycja: naprawiono link
źródło
Spróbuj zainstalować ten pakiet
pip install progressbar2
:progresssbar github: https://github.com/WoLpH/python-progressbar
źródło
w oparciu o powyższe odpowiedzi i inne podobne pytania dotyczące paska postępu CLI, myślę, że mam ogólną wspólną odpowiedź na wszystkie z nich. Sprawdź to na https://stackoverflow.com/a/15860757/2254146
Podsumowując, kod jest następujący:
Wygląda jak
Procent: [##########] 99,0%
źródło
Polecam użycie tqdm - https://pypi.python.org/pypi/tqdm - co ułatwia przekształcenie dowolnej iterowalnej lub przetworzonej w pasek postępu i obsługuje wszystkie problemy związane z potrzebnymi terminalami.
Z dokumentacji: „tqdm może z łatwością obsługiwać połączenia zwrotne / przechwytywania i aktualizacje ręczne. Oto przykład z urllib”
źródło
Bardzo prostym rozwiązaniem jest umieszczenie tego kodu w pętli:
Umieść to w treści (tj. U góry) pliku:
Umieść to w ciele swojej pętli:
źródło
UWAGA: jeśli uruchomisz to w interaktywnym interpreterie, wydrukowane zostaną dodatkowe liczby
źródło
lol właśnie napisałem całą sprawę dla tego kodu, pamiętaj, że nie możesz używać Unicode podczas wykonywania bloku ascii i używam CP437
i tak to nazywacie
więc tak to wygląda
źródło
Z powyższymi świetnymi radami opracowuję pasek postępu.
Chciałbym jednak wskazać pewne niedociągnięcia
Za każdym razem, gdy pasek postępu jest opróżniany, zaczyna się od nowej linii
jak to:
[] 0%
[#] 10%
[##] 20%
[###] 30%
2. Nawias kwadratowy „]” i liczba procentowa po prawej stronie przesuwają się w prawo, gdy cyfra „###” wydłuża się.
3. Błąd wystąpi, jeśli wyrażenie „progress / 10” nie może zwrócić liczby całkowitej.
Poniższy kod naprawi powyższy problem.
źródło
Kod paska postępu terminala python
źródło
napisałem prosty pasek postępu:
jak widać, ma: długość paska, prefiks i sufiks, wypełniacz, spację, tekst w pasku na 100% (oncomp) i obramowania
tutaj przykład:
w toku:
obecnie zakończone:
źródło
Zestawienie niektórych pomysłów, które tu znalazłem, i dodanie szacowanego pozostałego czasu:
źródło
Dla python 3:
źródło
Oto kod, który działa i przetestowałem go przed opublikowaniem:
Plusy:
Cons:
prog2 = prog/5
naprog2 = int(prog/5)
)źródło
Oto moje rozwiązanie Python 3:
„\ b” jest odwrotnym ukośnikiem dla każdego znaku w ciągu. To nie działa w oknie cmd systemu Windows.
źródło
funkcja z Greenstick dla 2.7:
źródło
Pasek postępu modułu python jest dobrym wyborem. Oto mój typowy kod:
źródło