mehrere Ausdrucke in derselben Zeile in Python

229

Ich möchte ein Skript ausführen, das im Grunde eine Ausgabe wie diese zeigt:

Installing XXX...               [DONE]

Derzeit drucke ich Installing XXX...zuerst und dann drucke ich [DONE].

Jetzt möchte ich jedoch drucken Installing xxx...und [DONE]in derselben Zeile.

Irgendwelche Ideen?

user697108
quelle
1
Antworten auf diese Frage erwähnen nicht, dass Sie manchmal die Linie löschen möchten, siehe: stackoverflow.com/questions/45263205
ideasman42

Antworten:

284

Sie können die printAnweisung verwenden, um dies ohne Import zu tun sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

Das Komma am Ende der printZeile verhindert print, dass eine neue Zeile ausgegeben wird (Sie sollten beachten, dass am Ende der Ausgabe ein zusätzliches Leerzeichen vorhanden ist).

Die Python 3-Lösung
Da das oben Genannte in Python 3 nicht funktioniert, können Sie dies stattdessen tun (erneut ohne Import sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

Die Druckfunktion akzeptiert einen endParameter, der standardmäßig verwendet wird "\n". Wenn Sie eine leere Zeichenfolge festlegen, wird verhindert, dass am Ende der Zeile eine neue Zeile ausgegeben wird.

mehrere Schnittstellen
quelle
1
Es funktioniert perfekt. Hatte bisher nur Standardlösungen gesehen. Wirklich gut das zu wissen.
Prometheus
5
Dies funktioniert nicht, wenn Sie beide Ausdrucke und eine zeitaufwändige Aktion dazwischen haben (alle in derselben Funktions- / Einrückungsstufe). Bevor die Aktion beginnt, gibt es überhaupt keine Ausgabe und nachdem sie beendet ist, erscheint die Ausgabe als Ganzes
Paddre
2
Dies ist wahrscheinlich eher eine Funktion der Ausgabepufferung, die vom Betriebssystem für den gesamten Prozess durchgeführt wird, was kein Python-spezifisches Problem ist. Eine stapelspezifische Problemumgehung finden Sie unter stackoverflow.com/questions/107705 .
mehrere
13
Ohne Zeilenumbruch möchten Sie den Puffer wahrscheinlich explizit leeren. Verwenden Sie print("...", end="", flush=True)in Python 3, in Python 2 fügen Sie einen sys.stdout.flush()Anruf.
Martijn Pieters
7
In Python 3.x möchten Sie ein "\ r" zum Ende hinzufügen, um die gedruckte Zeile VS zu ersetzen, die an das Ende print("Progress: {}%".format(var), end="\r", flush=True)
John
103

Sie können dies einfach verwenden:

print 'something',
...
print ' else',

und die Ausgabe wird sein

something else

keine Notwendigkeit zu übertreiben import sys. Achten Sie auf das Kommasymbol am Ende.

Python 3+ print("some string", end=""); zum Entfernen des Zeilenumbruchs am Ende. Lesen Sie mehr vonhelp(print);

Boldnik
quelle
3
Beachten Sie, dass es mit dieser Methode zwei Leerzeichen gibt
Ethanjyx
1
Dies ist die einfachste und effizienteste Antwort.
Gixxer
Dies funktioniert nicht, wenn die Argumente von print in Klammern stehen. Dies funktioniert: <print "Hallo",; print ("Hallo")> aber das funktioniert nicht <print ("Hallo",); print ("hallo")>
Mayank Jaiswal
@ MayankJaiswal Das funktioniert mit den Eltern. print ('hallo'),
drglove
1
printFunktion hat etwas andere Syntax in Python 2 VS 3.
Boldnik
52

Sie sollten die Rücktaste ' \ r ' oder (' \ x08 ') char verwenden, um zur vorherigen Position in der Konsolenausgabe zurückzukehren

Python 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

Dieser Code zählt in einer Zeile von 0% bis 100%. Der endgültige Wert ist:

> python test.py
100%

Zusätzliche Informationen zum Flush in diesem Fall hier: Warum verhalten sich Python-Druckanweisungen, die 'end =' - Argumente enthalten, in while-Schleifen anders?

Vadim Zin4uk
quelle
1
Zur Verdeutlichung sieht es so aus, als ob der auskommentierte Code in diesem Beispiel für Python 2 und die nicht kommentierten Zeilen für Python 3 sind.
Turtles Are Cute
1
Bouth Lines funktionieren in Python 3. Wenn Sie '\ x08' als Rücktaste verwenden, müssen Sie den Ausgabestream leeren - print ((b '\ x08' * n) .decode (), end = '', flush =
Richtig
1
Der Wagenrücklauf '\ r' geht zurück zum Zeilenanfang, daher ist das '* n' nicht
erforderlich
43

Verwenden Sie sys.stdout.write('Installing XXX... ')und sys.stdout.write('Done'). Auf diese Weise müssen Sie die neue Zeile von Hand hinzufügen, "\n"wenn Sie die Druckfunktion neu erstellen möchten. Ich denke, dass es unnötig sein könnte, Flüche nur dafür zu verwenden.

Ferostar
quelle
4
Ich persönlich bevorzuge diese Lösung der höher bewerteten, da sie auf python2.x und python3.x genauso funktioniert, ohne auf __future__Importe oder ähnliches angewiesen zu sein .
mgilson
17

Keine der Antworten funktionierte für mich, da alle pausierten, bis eine neue Zeile gefunden wurde. Ich habe einen einfachen Helfer geschrieben:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Um es zu testen:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"Hallo" wird zuerst ausgedruckt und vor dem Schlafengehen auf den Bildschirm gespült. Danach können Sie den Standarddruck verwenden.

Hyprnick
quelle
1
Danke dir! Genau das, was ich brauchte aka .flush ()
MrNice
11

Am einfachsten:

Python 3

    print('\r' + 'something to be override', end='')

Dies bedeutet, dass der Cursor auf den Anfang zurückgesetzt wird, dann etwas gedruckt wird und in derselben Zeile endet. In einer Schleife wird der Druck an derselben Stelle gestartet, an der er gestartet wurde.

Sunfloro
quelle
3
Cool! Funktioniert auch unter Windows.
Shital Shah
2
Danke, das funktioniert gut für mich! Ich denke, das print(’something to be override’, end=‘\r’)ist jedoch einfacher.
Tropilio
9

In diesem einfachen Beispiel wird 1-10 in derselben Zeile gedruckt.

for i in range(1,11):
    print (i, end=" ")
Umali Leonard
quelle
9

Drucken hat ein optionales endArgument, das am Ende gedruckt wird. Der Standardwert ist eine neue Zeile, Sie können sie jedoch in eine leere Zeichenfolge ändern. z.Bprint("hello world!", end="")

TulkinRB
quelle
2
Dies ist in Python 3. In Python 2 können Sie einfach print 'something',. Das Komma am Ende verhindert das Hinzufügen einer neuen Zeile.
Arjoonn
4

Wenn Sie die vorherige Zeile überschreiben möchten (anstatt sie kontinuierlich zu ergänzen), können Sie sie am Ende der print-Anweisung \rmit kombinieren print(),. Beispielsweise,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

zählt 0 bis 9 und ersetzt die alte Nummer in der Konsole. Das "...DONE!"wird in derselben Zeile wie der letzte Zähler gedruckt, 9.

In Ihrem Fall für das OP würde dies der Konsole ermöglichen, den prozentualen Abschluss der Installation als "Fortschrittsbalken" anzuzeigen, in dem Sie eine Anfangs- und Endzeichenposition definieren und die Markierungen dazwischen aktualisieren können.

print("Installing |XXXXXX              | 30%"),
Brian Bunker
quelle
4

Hier eine 2.7-kompatible Version, abgeleitet von der 3.0-Version von @ Vadim-Zin4uk:

Python 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

Im Übrigen sieht die mitgelieferte 3.0-Lösung etwas aufgebläht aus. Zum Beispiel verwendet die Rücktaste das Integer-Argument nicht und könnte wahrscheinlich ganz wegfallen.

Python 3

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

Beide wurden getestet und funktionieren.

Dannid
quelle
2

Dies ist ein sehr alter Thread, aber hier ist eine sehr gründliche Antwort und ein Beispielcode.

\rist die Zeichenfolgendarstellung von Carriage Return aus dem ASCII-Zeichensatz. Es ist dasselbe wie oktal 015[ chr(0o15)] oder hexadezimal 0d[ chr(0x0d)] oder dezimal 13[ chr(13)]. Siehe man asciifür eine langweilige Lektüre. Es ( \r) ist eine ziemlich tragbare Darstellung und für die Leute leicht zu lesen. Es bedeutet ganz einfach, den Wagen auf der Schreibmaschine ganz zum Start zurückzubewegen, ohne das Papier vorzuschieben. Es ist der CRTeil von CRLFdem bedeutet Carriage Return und Line Feed .

print()ist eine Funktion in Python 3. In Python 2 (jede Version, die Sie verwenden möchten) printkann sie durch Importieren ihrer Definition aus dem __future__Modul in eine Funktion gezwungen werden. Der Vorteil der printFunktion besteht darin, dass Sie angeben können, was am Ende gedruckt werden soll, und das Standardverhalten \nzum Drucken einer neuen Zeile am Ende jedes print()Aufrufs überschreiben .

sys.stdout.flushWeist Python an, die Ausgabe der Standardausgabe zu leeren , mit der Sie die Ausgabe senden, print()sofern Sie nichts anderes angeben. Sie können das gleiche Verhalten auch erzielen, python -uindem Sie die Umgebungsvariable ausführen oder PYTHONUNBUFFERED=1festlegen import sysund dabei die sys.stdout.flush()Aufrufe und überspringen . Der Betrag, den Sie dadurch gewinnen, ist fast genau Null und nicht sehr einfach zu debuggen, wenn Sie bequemerweise vergessen, dass Sie diesen Schritt ausführen müssen, bevor sich Ihre Anwendung ordnungsgemäß verhält.

Und eine Probe. Beachten Sie, dass dies in Python 2 oder 3 perfekt läuft.

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()
Chris Cosby
quelle
Ich denke, Ihre Antwort ist besser geeignet für: stackoverflow.com/questions/45263205/…
Marc Cayuela Rafols
2

print () hat einen eingebauten Parameter "end", der standardmäßig auf "\ n" gesetzt ist. Wenn Sie print ("This is America") aufrufen, wird print ("This is America", end = "\ n") aufgerufen. Eine einfache Möglichkeit besteht darin, print aufzurufen ("This is America", end = "").

Miles Mbo
quelle
1

Nur für den Fall, dass Sie die Werte in einem Array vorgespeichert haben, können Sie sie im folgenden Format aufrufen:

for i in range(0,n):
       print arr[i],
k20392
quelle
1

Python fügt Newline als Druckende an. Verwenden Sie end = '' für python3 als Druckmethode, um ein Leerzeichen anstelle einer neuen Zeile anzuhängen. Verwenden Sie für Python2 das Komma am Ende der Druckanweisung.

print("Foo",end=' ')
print('Bar')
MrKulli
quelle
0

Fand diesen Quora-Beitrag mit diesem Beispiel, das für mich funktioniert hat (Python 3), das näher an dem war, wofür ich es brauchte (dh die gesamte vorherige Zeile löschen).

Das Beispiel, das sie liefern:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

Verwenden Sie zum Drucken in derselben Zeile, wie von anderen vorgeschlagen, einfach end=""

Mircea
quelle
-2

Ich habe diese Lösung gefunden und sie funktioniert unter Python 2.7

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms
Luis Silva
quelle
1
Das printist eine falsche Syntax für Python 2.7 und der Code funktioniert auch bei korrekter Syntax nicht.
Cory Madden