2421 Stimmen

Wie drucke ich ohne Zeilenumbruch oder Leerzeichen?

Beispiel in C:

for (int i = 0; i < 4; i++)
    printf(".");

出力します。

....

In Python:

>>> for i in range(4): print('.')
.
.
.
.
>>> print('.', '.', '.', '.')
. . . .

In Python, print wird eine \n oder Raum. Wie kann ich das vermeiden? Ich würde gerne wissen, wie man Zeichenketten "anhängen" kann stdout .

8 Stimmen

Für diejenigen, die die Dokumentation zur String-Formatierung von Python durchsuchen: docs.python.org/library/stdtypes.html#string-formatting

1 Stimmen

Es sieht so aus, als ob eine ähnliche Frage schon einmal gestellt worden wäre: https://stackoverflow.com/q/255147/9325817

1 Stimmen

Etwas spät zur Party, aber warum nicht print("." * 10) ?

6voto

Subbu Punkte 2033

Sie können dasselbe in Python 3 wie folgt tun:

#!usr/bin/python

i = 0
while i<10 :
    print('.', end='')
    i = i+1

Und führen Sie es mit python filename.py o python3 filename.py .

5voto

DisneyWizard Punkte 67

lenooh zufrieden meine Anfrage. Ich entdeckte diesen Artikel bei der Suche nach 'python suppress newline'. Ich verwende IDLE 3 auf Raspberry Pi zur Entwicklung von Python 3.2 für PuTTY .

Ich wollte einen Fortschrittsbalken in der PuTTY-Befehlszeile erstellen. Ich wollte nicht, dass die Seite wegscrollt. Ich wollte eine horizontale Linie, um den Benutzer vor dem Ausrasten zu bewahren, dass das Programm nicht zum Stillstand gekommen ist und auch nicht in einer fröhlichen Endlosschleife zum Mittagessen geschickt wurde - als Appell an die interaktive Nachricht "Lass mich in Ruhe, es geht mir gut, aber es kann einige Zeit dauern" - wie ein Fortschrittsbalken in Textform.

El print('Skimming for', search_string, '\b! .001', end='') initialisiert die Nachricht, indem es den nächsten Schreibvorgang auf dem Bildschirm vorbereitet, bei dem drei Leerzeichen als Rubout und dann ein Punkt gedruckt werden, wodurch '001' gelöscht und die Zeile mit den Punkten verlängert wird.

Nach search_string Benutzereingaben nachplappert, wird die \b! stutzt das Ausrufezeichen meiner search_string Text, um den Raum zu überdecken, der print() sonst zwingt, die Interpunktion richtig zu setzen. Darauf folgen ein Leerzeichen und der erste "Punkt" des "Fortschrittsbalkens", den ich simuliere.

Unnötigerweise wird die Nachricht dann auch mit der Seitenzahl (formatiert auf eine Länge von drei mit führenden Nullen) versehen, um den Benutzer darauf aufmerksam zu machen, dass die Verarbeitung voranschreitet, und die auch die Anzahl der Perioden widerspiegelt, die wir später auf der rechten Seite aufbauen werden.

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])

#print footers here
if not (len(list)==items):
    print('#error_handler')

Das Fleisch des Fortschrittsbalkens befindet sich in der sys.stdout.write('\b\b\b.'+format(page, '03')) Linie. Um nach links zu löschen, wird zunächst der Cursor über den drei numerischen Zeichen mit dem Zeichen ' \b\b\b ' als Rubout und fügt einen neuen Punkt hinzu, um die Länge des Fortschrittsbalkens zu erhöhen. Dann werden drei Ziffern der Seite geschrieben, bis zu der der Balken fortgeschritten ist. Weil sys.stdout.write() auf einen vollen Puffer oder das Schließen des Ausgabekanals wartet, wird die sys.stdout.flush() erzwingt das sofortige Schreiben. sys.stdout.flush() ist in das Ende von print() die mit print(txt, end='' ) . Dann durchläuft der Code seine alltäglichen, zeitintensiven Operationen, während er nichts mehr ausgibt, bis er hierher zurückkehrt, um drei Ziffern zurückzuwischen, einen Punkt hinzuzufügen und wieder drei Ziffern zu schreiben, inkrementiert.

Die drei Ziffern, die ausgelöscht und neu geschrieben werden, sind keineswegs notwendig - es ist nur eine Verzierung, die verdeutlicht sys.stdout.write() gegen print() . Sie könnten genauso gut mit einem Punkt beginnen und die drei schicken Backslash-B-Backspaces vergessen (und natürlich auch keine formatierten Seitenzahlen schreiben), indem Sie einfach die Punktleiste jedes Mal um eins länger drucken - ohne Leerzeichen oder Zeilenumbrüche, indem Sie einfach die sys.stdout.write('.'); sys.stdout.flush() Paar.

Bitte beachten Sie, dass die Raspberry Pi IDLE 3 Python-Shell die Rücktaste nicht als Rubout erkennt, sondern stattdessen ein Leerzeichen ausgibt, wodurch eine scheinbare Liste von Brüchen entsteht.

5voto

Bala.K Punkte 133

Sie möchten etwas in der für Schleife richtig; aber Sie wollen nicht, dass es jedes Mal in einer neuen Zeile gedruckt wird...

Zum Beispiel:

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

Sie wollen aber, dass es so gedruckt wird: hi hi hi hi hi hi rechts????

Fügen Sie einfach ein Komma nach dem Ausdruck "Hallo" ein.

Beispiel:

for i in range (0,5):
    print "hi",

OUTPUT:

hi hi hi hi hi

6 Stimmen

Nein, der Auftraggeber will hihihihihi, nicht hi hi hi hi hi

5voto

jarr Punkte 102

Viele dieser Antworten scheinen ein wenig kompliziert zu sein. In Python 3.x machen Sie einfach dies:

print(<expr>, <expr>, ..., <expr>, end=" ")

Der Standardwert für end ist "\n" . Wir ändern es einfach in ein Leerzeichen oder Sie können auch verwenden end="" (kein Leerzeichen) zu tun, was printf normalerweise tut.

5voto

Bikram Kumar Punkte 59

Sie werden feststellen, dass alle oben genannten Antworten richtig sind. Aber ich wollte eine Abkürzung machen, um immer den Parameter " end='' " am Ende zu schreiben.

Sie könnten eine Funktion definieren wie

def Print(*args, sep='', end='', file=None, flush=False):
    print(*args, sep=sep, end=end, file=file, flush=flush)

Es würde die gesamte Anzahl von Parametern akzeptieren. Auch alle anderen Parameter, wie file, flush, etc. und mit dem gleichen Namen werden akzeptiert.

0 Stimmen

Es läuft nicht, es beschwert sich, dass *arg ist am Anfang (Python 2.7), und wenn ich es ans Ende setze, läuft es zwar, aber es funktioniert nicht ganz richtig. Ich habe eine Funktion definiert, die nur Print(*args) und rief dann einfach print mit sep='', end='' . Und jetzt funktioniert es so, wie ich es will. Also ein Upvote für die Idee.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X