2010-08-05 11 views
43

Zasadniczo chcę zrobić coś odwrotnego niż ten facet ... hehe.Wydrukuj do tej samej linii, a nie do nowej linii w pytonie

Python Script: Print new line each time to shell rather than update existing line

Mam program, który mówi mi, jak daleko to jest.

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete" 

Jeśli więc len (some_list) był 50, wydrukowałbym ostatnią linię 50 razy. Chcę wydrukować jedną linię i aktualizować tę linię. Wiem, że wiem, że to prawdopodobnie najśmielsze pytanie, które przeczytasz cały dzień. Po prostu nie mogę wymyślić czterech słów, które muszę umieścić w Google, aby uzyskać odpowiedź.

Zaktualizować! Wypróbowałem sugestię mvds, która wydaje się właściwa. Nowy kod

print percent_complete,"   \r", 

Procent pełna jest po prostu ciągiem (abstrahując byłem po raz pierwszy teraz stara się być dosłowny). Rezultatem jest to, że uruchamia program, nie drukuje nic, dopóki program się nie skończy, a następnie wypisze "ukończone w 100%" w jednej i tylko jednej linii.

Bez powrotu karetki (ale z przecinkiem, połowa sugestii mvds) nic nie drukuje do końca. Następnie drukuje:

0 percent complete  2 percent complete  3 percent complete  4 percent complete  

I tak dalej. Teraz nowym problemem jest to, że z przecinkiem nie drukuje aż do zakończenia programu.

Przy powrocie karetki i bez przecinka zachowuje się tak samo, jak w przypadku żadnego z nich.

+0

Możesz także chcieć sprawdzić 'sys.stdout.isatty()', abyś nie wypluł tych rzeczy, gdy nie działa w terminalu. – mvds

+0

Używam tego z terminala ... dobra myśl. Na pewno będę to potrzebował w pewnym momencie. – chriscauley

+1

tło jest, przy okazji, że w kilku językach \ n (który teraz pomijamy) służy jako niejawny sygnał do wypuszczenia na standardowe wyjście. W przeciwnym razie wiele osób będzie zdezorientowanych. – mvds

Odpowiedz

66

To się nazywa powrót karetki lub \r

Zastosowanie

print i/len(some_list)*100," percent complete   \r", 

Przecinek uniemożliwia drukowanie z dodaniem nowej linii. (i spacje będą utrzymywać linię czystą z poprzedniej wydajności)

Pamiętaj także, aby zakończyć z print "", aby uzyskać co najmniej finlinujący znak nowej linii!

+6

Tylko upewnij się, że zawsze drukujesz tę samą ilość danych (lub więcej niż jakikolwiek poprzedni wydruk) na linii, w przeciwnym razie skończysz z cruft na końcu. –

+1

+1 naprawdę dobry punkt, naprawię – mvds

+0

Tak blisko ... Zaktualizuję pytanie z wynikiem tego. – chriscauley

0

Spróbuj to tak: (. Z przecinkiem na końcu)

for i in some_list: 
    #do a bunch of stuff. 
    print i/len(some_list)*100," percent complete", 

+0

To tylko dołącza nowy tekst do starego (funkcjonalnie podobny, ale brzydki). – chriscauley

2

Działa to dla mnie, włamał się go raz, aby sprawdzić, czy jest możliwe, ale nigdy nie używane w moim Program (GUI jest tak dużo ładniejszy):

import time 
f = '%4i %%' 
len_to_clear = len(f)+1 
clear = '\x08'* len_to_clear 
print 'Progress in percent:'+' '*(len_to_clear), 
for i in range(123): 
    print clear+f % (i*100//123), 
    time.sleep(0.4) 
raw_input('\nDone') 
18

Od Pythona 3.x można zrobić:

print('bla bla', end='') 

(która może być również używana w Pythonie 2.6 lub 2.7 umieszczając from __future__ import print_function na górze skryptu/modułu) konsoli

Python progressbar przykład:

import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    n=0 
    while n<total: 
     done = '#'*(n+1) 
     todo = '-'*(total-n-1) 
     s = '<{0}>'.format(done+todo) 
     if not todo: 
      s+='\n'   
     if n>0: 
      s = '\r'+s 
     print(s, end='') 
     yield n 
     n+=1 

# example for use of status generator 
for i in range_with_status(10): 
    time.sleep(0.1) 
+0

Pojawi się \ r, aby dodać nową linię. – fccoelho

9

dla konsoli będzie potrzebne

sys.stdout.flush() 

wymusić aktualizację. Myślę, że przy użyciu , drukiem zablokuje stdout z płukaniem i jakoś nie zaktualizuje

+0

Terminator odświeżał linię tylko co 30 sekund, gdy używam print ("...", end = "\ r"), chyba że uruchomię to polecenie natychmiast po wydrukowaniu komunikat. Dzięki –

8

dla mnie, co zadziałało było combo Remi i odpowiedzi siriusd za:

from __future__ import print_function 
import sys 

print(str, end='\r') 
sys.stdout.flush() 
0
import time 
import sys 


def update_pct(w_str): 
    w_str = str(w_str) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(" " * len(w_str)) 
    sys.stdout.write("\b" * len(w_str)) 
    sys.stdout.write(w_str) 
    sys.stdout.flush() 

for pct in range(0, 101): 
    update_pct("{n}%".format(n=str(pct))) 
    time.sleep(0.1) 

\b będzie przesunąć umiejscowienie kursora w tył o jedno pole
Więc przenosimy je z powrotem na początek linii
Następnie zapisujemy spacje, aby wyczyścić bieżącą linię - podczas pisania spacji kursor przesuwa się w przód/w prawo o jeden
Więc musimy przesunąć kursor z powrotem na początku linii przed piszemy nasze nowe dane

testowany na cmd Windows przy użyciu Python 2.7

0

podstawie Remi answer dla Python 2.7+ użytku to:

from __future__ import print_function 
import time 

# status generator 
def range_with_status(total): 
    """ iterate from 0 to total and show progress in console """ 
    import sys 
    n = 0 
    while n < total: 
     done = '#' * (n + 1) 
     todo = '-' * (total - n - 1) 
     s = '<{0}>'.format(done + todo) 
     if not todo: 
      s += '\n' 
     if n > 0: 
      s = '\r' + s 
     print(s, end='\r') 
     sys.stdout.flush() 
     yield n 
     n += 1 


# example for use of status generator 
for i in range_with_status(50): 
    time.sleep(0.2) 
Powiązane problemy