Drukuj dynamicznie w jednej linii

Chciałbym przedstawić kilka instrukcji, które dają standardowe wyjście bez widoczności znaków nowej linii pomiędzy instrukcjami.

Konkretnie, przypuśćmy, że mam:

for item in range(1,100):
    print item

Wynik jest następujący:

1
2
3
4
.
.
.

Jak to wygląda:

1 2 3 4 5 ...

Jeszcze lepiej, czy można wydrukować pojedynczy numer nad ostatnim numerem, więc tylko jeden numer jest na ekranie na raz?

Author: unutbu, 2010-07-14

17 answers

Zmień print item Na:

  • print item, w Pythonie 2.7
  • print(item, end=" ") w Pythonie 3

Jeśli chcesz wydrukować dane dynamicznie, użyj składni:

  • print(item, sep=' ', end='', flush=True) w Pythonie 3
 395
Author: ewall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 07:47:07
Przy okazji...... Jak go odświeżyć za każdym razem, aby wydrukować mi w jednym miejscu, po prostu zmień numer.

Ogólnie rzecz biorąc, można to zrobić za pomocą kodów sterowania terminalem. Jest to szczególnie prosty przypadek, do którego potrzebny jest tylko jeden znak specjalny: u+000d CARRIAGE RETURN, który jest napisany '\r' w Pythonie (i wielu innych językach). Oto kompletny przykład oparty na Twoim kodzie:

from sys import stdout
from time import sleep
for i in range(1,20):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(1)
stdout.write("\n") # move the cursor to the next line

Niektóre rzeczy na ten temat, które mogą być zaskakujące:

  • \r idzie na początku łańcucha tak, że podczas pracy programu kursor zawsze będzie po numerze. To nie jest tylko kosmetyczne: niektóre emulatory terminali są bardzo zdezorientowane, jeśli robisz to na odwrót.
  • Jeśli nie dołączysz ostatniego wiersza, to po zakończeniu programu powłoka wydrukuje znak zachęty na górze numeru.
  • {[3] } jest konieczne w niektórych systemach, inaczej nie otrzymasz żadnego wyjścia. Inne systemy może tego nie wymagać, ale nie szkodzi.

Jeśli okaże się, że to nie działa, pierwszą rzeczą, którą powinieneś podejrzewać, jest to, że Twój emulator terminala jest wadliwy. Program vttest pomoże Ci go przetestować.

Możesz zastąpić stdout.write instrukcją print, ale wolę nie mieszać print z bezpośrednim użyciem obiektów plików.

 138
Author: zwol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 19:04:08

Użyj print item,, aby polecenie print pominęło znak nowej linii.

W Pythonie 3 to print(item, end=" ").

Jeśli chcesz, aby każda liczba wyświetlała się w tym samym miejscu, Użyj na przykład (Python 2.7):

to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
    print "{0}{1:{2}}".format(delete, i, digits),

W Pythonie 3 jest to nieco bardziej skomplikowane; tutaj musisz spłukać sys.stdout, inaczej nic nie wydrukuje, dopóki pętla się nie skończy:

import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
   print("{0}{1:{2}}".format(delete, i, digits), end="")
   sys.stdout.flush()
 44
Author: Tim Pietzcker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 20:16:55

Podobnie jak inne przykłady,
Używam podobnego podejścia, ale zamiast spędzać czas na obliczaniu ostatniej długości wyjścia, itp,

Po prostu używam znaków specjalnych ANSI, aby wrócić do początku linii, a następnie wyczyścić całą linię przed wydrukowaniem mojego bieżącego wyjścia stanu.

import sys

class Printer():
    """Print things to stdout on one line dynamically"""
    def __init__(self,data):
        sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()

Aby użyć w pętli iteracji, wystarczy wywołać coś w stylu:

x = 1
for f in fileList:
    ProcessFile(f)
    output = "File number %d completed." % x
    Printer(output)
    x += 1   

Zobacz więcej tutaj

 15
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-19 03:37:17

Możesz dodać końcowy przecinek do instrukcji print, aby wypisać spację zamiast nowej linii w każdej iteracji:

print item,

Alternatywnie, jeśli używasz Pythona 2.6 lub nowszego, możesz użyć nowej funkcji drukowania, która pozwoli Ci określić, że nawet spacja nie powinna pojawiać się na końcu każdego wydrukowanego elementu (Lub pozwoli Ci określić dowolny koniec):

from __future__ import print_function
...
print(item, end="")

Wreszcie, możesz pisać bezpośrednio na standardowe wyjście, importując je z modułu sys, który zwraca obiekt podobny do pliku:

from sys import stdout
...
stdout.write( str(item) )
 13
Author: Eli Courtwright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 19:08:03

Zmień

print item

Do

print "\033[K", item, "\r",
sys.stdout.flush()
  • "\033[K" ]}
  • \r, zwraca początek linii
  • instrukcja flush upewnia się, że wyświetla się natychmiast, dzięki czemu otrzymujesz wyniki w czasie rzeczywistym.
 9
Author: Brooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 21:37:18

Myślę, że proste połączenie powinno zadziałać:

nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)
 5
Author: xortion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 17:54:21

"przy okazji...... Jak go odświeżyć za każdym razem, aby wydrukować mi w jednym miejscu, po prostu zmień numer."

To naprawdę trudny temat. Co zack zasugerował (wysyłanie kodów sterowania konsolą) jest jednym ze sposobów, aby to osiągnąć.

Możesz używać (n)przekleństw, ale działa to głównie na * nixach.

Na Windowsie (a tu ciekawa część), o której rzadko się wspomina (nie rozumiem dlaczego) można użyć wiązań Pythona do WinAPI ( http://sourceforge.net/projects/pywin32/ również z ActivePython domyślnie) - nie jest to takie trudne i działa dobrze. Oto mały przykład:

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    output_handle.WriteConsoleOutputCharacter( i, pos )
    time.sleep( 1 )

Lub, jeśli chcesz użyć print (Instrukcja lub funkcja, bez różnicy):

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    print i
    output_handle.SetConsoleCursorPosition( pos )
    time.sleep( 1 )

win32console moduł pozwala na wykonywanie wielu ciekawych rzeczy z konsolą windows... Nie jestem wielkim fanem WinAPI, ale ostatnio zdałem sobie sprawę, że co najmniej połowa mojej niechęci do niego była spowodowana pisaniem kodu WinAPI w powiązaniach C-pythonic są znacznie łatwiejsze w użyciu.

Wszystkie inne odpowiedzi są świetne i pythoniczne, oczywiście, ale... Co jeśli chcę wydrukować na poprzedniej linii? Lub napisać tekst wielowierszowy, a następnie wyczyścić go i napisać te same linie ponownie? Moje rozwiązanie to umożliwia.

 3
Author: cji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 20:32:45

Kolejna odpowiedź, której używam na 2.7, gdzie właśnie drukuję"."za każdym razem, gdy uruchomiona jest pętla (aby wskazać użytkownikowi, że rzeczy są nadal uruchomione) jest to:

print "\b.",

Drukuje "."znaki bez spacji między każdym. Wygląda trochę lepiej i działa całkiem dobrze. \B jest znakiem backspace dla tych, którzy się zastanawiają.

 3
Author: copeland3300,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-14 19:42:48

Aby Liczby się nadpisały, możesz zrobić coś takiego:

for i in range(1,100):
    print "\r",i,

To powinno działać tak długo, jak numer jest drukowany w pierwszej kolumnie.

Edytuj: Oto wersja, która będzie działać, nawet jeśli nie jest drukowana w pierwszej kolumnie.

prev_digits = -1
for i in range(0,1000):
    print("%s%d" % ("\b"*(prev_digits + 1), i)),
    prev_digits = len(str(i))

Powinienem zauważyć, że ten kod został przetestowany i działa dobrze w Pythonie 2.5 Na Windows, w konsoli WIndows. Według niektórych innych, płukanie choroby wenerycznej może być wymagane, aby zobaczyć wyniki. YMMV.

 2
Author: Adam Crossland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 20:30:30
In [9]: print?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function print>
Namespace:      Python builtin
Docstring:
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep:  string inserted between values, default a space.
end:  string appended after the last value, default a newline.
 1
Author: gtrak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 19:06:57
for i in xrange(1,100):
  print i,
 1
Author: eruciform,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 19:08:44

Dla Pythona 2.7

for x in range(0, 3):
    print x,

Dla Pythona 3

for x in range(0, 3):
    print(x, end=" ")
 1
Author: Adnan Ghaffar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 13:03:14

Jeśli chcesz tylko wydrukować liczby, możesz uniknąć pętli.

# python 3
import time

startnumber = 1
endnumber = 100

# solution A without a for loop
start_time = time.clock()
m = map(str, range(startnumber, endnumber + 1))
print(' '.join(m))
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('took {0}ms\n'.format(timetaken))

# solution B: with a for loop
start_time = time.clock()
for i in range(startnumber, endnumber + 1):
    print(i, end=' ')
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('\ntook {0}ms\n'.format(timetaken))

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 wziął 21.1986929975 ms

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 wziął 491.466823551 ms

 0
Author: Mahmoud Kassem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 20:50:50

Najlepszym sposobem na to jest użycie znaku \r

Po prostu wypróbuj poniższy kod:

import time
for n in range(500):
  print(n, end='\r')
  time.sleep(0.01)
print()  # start new line so most recently printed number stays
 0
Author: vitiral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 20:24:31

W Pythonie 3 możesz to zrobić w ten sposób:

for item in range(1,10):
    print(item, end =" ")

Wyjścia:

1 2 3 4 5 6 7 8 9 

Krotka: możesz zrobić to samo z krotką:

tup = (1,2,3,4,5)

for n in tup:
    print(n, end = " - ")

Wyjścia:

1 - 2 - 3 - 4 - 5 - 

Inny przykład:

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for item in list_of_tuples:
    print(item)

Wyjścia:

(1, 2)
('A', 'B')
(3, 4)
('Cat', 'Dog')

Możesz nawet rozpakować swoją krotkę w ten sposób:

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]

# Tuple unpacking so that you can deal with elements inside of the tuple individually
for (item1, item2) in list_of_tuples:
    print(item1, item2)   

Wyjścia:

1 2
A B
3 4
Cat Dog

Inny wariant:

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for (item1, item2) in list_of_tuples:
    print(item1)
    print(item2)
    print('\n')

Wyjścia:

1
2


A
B


3
4


Cat
Dog
 0
Author: Stryker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-13 16:28:32

Dla Pythona(2.7)

 l=""                             #empty string variable
    for item in range(1,100):
        item=str(item)            #converting each element to string
        l=l+" "+item              #concating each element
        l.lstrip()                # deleting the space that was created initially 
    print l                      #prining the whole string

Python 3

 l=""
        for item in range(1,100):
            item=str(item)
            l=l+" "+item
            l.lstrip()
        print(l)
 -1
Author: GEEK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 10:20:45