Wie drucke ich ohne Zeilenumbruch oder Leerzeichen?


1872

Ich würde es gerne machen . Was ich in diesem Beispiel in tun möchte::

In C:

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

Ausgabe:

..........

In Python:

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

In Python printwird ein \noder Leerzeichen hinzugefügt , wie kann ich das vermeiden? Nun, es ist nur ein Beispiel. Sagen Sie mir nicht, dass ich zuerst einen String erstellen und dann drucken kann. Ich würde gerne wissen, wie man Strings an "anhängt" stdout.


8
Für diejenigen, die die String-Formatierungsdokumentation von Python durchsuchen
guettli

1
Es sieht so aus, als ob zuvor eine ähnliche Frage gestellt wurde: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Antworten:


2535

In Python 3 können Sie die Parameter sep=und end=der printFunktion verwenden:

So fügen Sie am Ende der Zeichenfolge keine neue Zeile hinzu:

print('.', end='')

So fügen Sie kein Leerzeichen zwischen allen Funktionsargumenten ein, die Sie drucken möchten:

print('a', 'b', 'c', sep='')

Sie können eine beliebige Zeichenfolge an einen der Parameter übergeben und beide Parameter gleichzeitig verwenden.

Wenn Sie Probleme mit der Pufferung haben, können Sie die Ausgabe leeren, indem Sie ein flush=TrueSchlüsselwortargument hinzufügen :

print('.', end='', flush=True)

Python 2.6 und 2.7

Aus Python 2.6 können Sie die printFunktion entweder mit dem folgenden __future__Modul aus Python 3 importieren :

from __future__ import print_function

Hiermit können Sie die oben genannte Python 3-Lösung verwenden.

Beachten Sie jedoch, dass das flushSchlüsselwort in der Version der in Python 2 printimportierten Funktion nicht verfügbar ist __future__. Es funktioniert nur in Python 3, genauer gesagt in Version 3.3 und höher. In früheren Versionen müssen Sie bei einem Aufruf von noch manuell spülen sys.stdout.flush(). Sie müssen auch alle anderen Druckanweisungen in der Datei, in die Sie diesen Import durchführen, neu schreiben.

Oder Sie können verwenden sys.stdout.write()

import sys
sys.stdout.write('.')

Möglicherweise müssen Sie auch anrufen

sys.stdout.flush()

um sicherzustellen, stdoutwird sofort gespült.


2
Vielen Dank! In Python 3.6.3 ist Flush = True von entscheidender Bedeutung, da es sonst nicht wie beabsichtigt funktioniert.
Gunit

3
Kann mir jemand erklären, warum ich flushdas tun muss und was es eigentlich tut?
Rishav

5
Es ist ein paar Monate zu spät, aber um @Rishav Flush zu beantworten, wird der Puffer geleert und die Ausgabe wird sofort angezeigt. Ohne Flush können Sie möglicherweise Ihren genauen Text drucken lassen, aber nur, wenn das System die Grafiken anstelle der E / A verarbeitet. Flush macht den Text sofort sichtbar, indem der Cache "geleert" wird.
Große Schildkröte

297

Es sollte so einfach sein wie unter diesem Link von Guido Van Rossum beschrieben:

Betreff: Wie druckt man ohne AC / R?

http://legacy.python.org/search/hypermail/python-1992/0115.html

Ist es möglich, etwas zu drucken, ohne dass automatisch ein Wagenrücklauf angehängt wird?

Ja, fügen Sie nach dem letzten zu druckenden Argument ein Komma hinzu. Diese Schleife druckt beispielsweise die Zahlen 0..9 in einer durch Leerzeichen getrennten Zeile. Beachten Sie den parameterlosen "Druck", der die letzte neue Zeile hinzufügt:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 

99
Dies wird in der Frage speziell als unerwünschtes Verhalten aufgrund der Leerzeichen aufgeführt
Zags

87
Im Gegenteil, die Antwort sollte aus zwei Gründen gelöscht werden: Sie hat unerwünschte Nebenwirkungen, die Sie nicht deaktivieren können (einschließlich zusätzlicher Leerzeichen), und sie ist nicht vorwärtskompatibel mit Python 3 (die Klammern erzwingen eine Konvertierung in ein Tupel). . Ich erwarte diese Art von schlampigen Konstrukten von PHP, nicht von Python. Es ist also am besten, dies niemals zu verwenden.
Eric Leschinski

9
//, Dies ist jedoch der einfachste Weg, dies in Python 2 zu erreichen, und es gibt eine Menge einmaligen Codes für wirklich alte Betriebssysteme. Wahrscheinlich nicht die beste Lösung oder sogar empfohlen. Einer der großen Vorteile von StackOverflow ist jedoch, dass wir wissen, welche verrückten Tricks es gibt. KDP, würden Sie oben eine kurze Warnung darüber einfügen, was @Eric Leschinski gesagt hat? Es macht schließlich Sinn.
Nathan Basanese

23
@nathanbasanese Einfach oder nicht, es hat einen Nebeneffekt, den der Fragesteller ausdrücklich nicht will . Abgestimmt.
Shadur

8
270 positive Stimmen für eine Antwort, die die Frage speziell nicht beantwortet. Gute Arbeit, Leute zu stimmen. Gute Arbeit.
Zylindrisch

168

Hinweis: Der Titel dieser Frage lautete früher etwa "Wie drucke ich in Python?"

Da die Leute möglicherweise hierher kommen, um nach dem Titel zu suchen, unterstützt Python auch die Ersetzung im printf-Stil:

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

Und Sie können Zeichenfolgenwerte problemlos multiplizieren:

>>> print "." * 10
..........

10
In der Tat fehlt der Punkt. :) Da es bereits eine gute Antwort auf die Frage gab, habe ich nur einige verwandte Techniken ausgearbeitet, die sich als nützlich erweisen könnten.
Beau

8
Aufgrund des Titels der Frage glaube ich, dass diese Antwort analog zu der üblichen Verwendung von printf in C / C ++
Dan

16
Dies beantwortet den Titel der Frage, aber nicht den Körper. Das heißt, es gab mir das, wonach ich suchte. :)
Ayman

2
Es ist nicht die Antwort auf die Frage
Vanuan

4
@ Vanuan, ich erklärte am Ende meiner Antwort, dass sich der Titel der Frage irgendwann geändert hat. :)
Beau

93

Verwenden Sie die Druckfunktion im Python3-Stil für Python2.6 + (werden auch alle vorhandenen Schlüsselanweisungen für Schlüsselwörter in derselben Datei beschädigt.)

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

Erstellen Sie eine separate printf.pyDatei , um nicht alle Ihre Python2-Druckschlüsselwörter zu ruinieren

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

Verwenden Sie es dann in Ihrer Datei

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

Weitere Beispiele für den Druckstil

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000

39

So drucken Sie in derselben Zeile:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()

27

Die neue Funktion (ab Python 3.x) printverfügt über einen optionalen endParameter, mit dem Sie das Endzeichen ändern können:

print("HELLO", end="")
print("HELLO")

Ausgabe:

HALLO HALLO

Es gibt auch sepfür Trennzeichen:

print("HELLO", "HELLO", "HELLO", sep="")

Ausgabe:

HALLO HALLO HALLO

Wenn Sie dies in Python 2.x verwenden möchten, fügen Sie dies einfach am Anfang Ihrer Datei hinzu:

from __future__ import print_function


1
was macht "sep"?
McPeppr

1
@ McPeppr Ich weiß, dass dies alt ist, aber ich habe die Antwort trotzdem bearbeitet, um mehr Klarheit zu schaffen. Überprüfen Sie es jetzt.
TheTechRobo36414519

Danke für die Bearbeitung. September wird nützlich sein. Bisher habe ich sep.join (Liste) verwendet, um Elemente einer Liste mit einem Trennzeichen dazwischen zu verketten - perfekt zum Schreiben von CSV-Dateien
McPeppr

21

Verwenden Sie functools.partial, um eine neue Funktion namens printf zu erstellen

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

Einfache Möglichkeit, eine Funktion mit Standardparametern zu umschließen.


16

Sie können einfach ,am Ende der printFunktion hinzufügen, damit keine neue Zeile gedruckt wird.


1
//, Dadurch wurde tatsächlich nichts ausgedruckt. Müssen wir dann am Ende keine weitere print-Anweisung ohne Argument hinzufügen, wie in stackoverflow.com/a/493500/2146138 gezeigt ? Wären Sie bereit, diese Antwort mit einem wirklich kurzen Beispiel mit zwei oder drei Zeilen zu bearbeiten?
Nathan Basanese

3
Das OP will kein Leerzeichen
anhängen

2
Hat die Frage nicht beantwortet. Kein Platz.
Spitzmaus

Dies funktioniert in Python 2.x nicht mehr und beantwortet nur die Hälfte dessen, was das OP wollte. Warum 16 Upvotes?
TheTechRobo36414519

12

In Python 3+ printist eine Funktion. Wenn du anrufst

print('hello world')

Python übersetzt es in

print('hello world', end='\n')

Sie können endnach Belieben wechseln .

print('hello world', end='')
print('hello world', end=' ')

8

Python 2.6+ :

from __future__ import print_function # needs to be first statement in file
print('.', end='')

Python 3 :

print('.', end='')

Python <= 2,5 :

import sys
sys.stdout.write('.')

Wenn nach jedem Druck zusätzlicher Speicherplatz in Ordnung ist, in Python 2

print '.',

irreführend in Python 2 - vermeiden Sie :

print('.'), # avoid this if you want to remain sane
# this makes it look like print is a function but it is not
# this is the `,` creating a tuple and the parentheses enclose an expression
# to see the problem, try:
print('.', 'x'), # this will print `('.', 'x') `

8

Du kannst es versuchen:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')

5

In Python3 können Sie dasselbe wie folgt tun:

#!usr/bin/python

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

und führen Sie es mit python filename.pyoder auspython3 filename.py


5

Ich hatte vor kurzem das gleiche Problem ..

Ich habe es gelöst, indem ich:

import sys, os

# reopen stdout with "newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '\n'
# output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
        print(i)

Dies funktioniert sowohl unter Unix als auch unter Windows. Ich habe es nicht unter MacOSX getestet.

hth


2
Pausensys.__stdout__
pppery

4

@lenooh hat meine Anfrage erfüllt. Ich habe diesen Artikel bei der Suche nach "Python Suppress Newline" entdeckt. Ich verwende IDLE3 auf Raspberry Pi, um Python 3.2 für PuTTY zu entwickeln. Ich wollte einen Fortschrittsbalken in der PuTTY-Befehlszeile erstellen. Ich wollte nicht, dass die Seite wegrollt. Ich wollte eine horizontale Linie, um dem Benutzer zu versichern, dass das Programm nicht zum Stillstand gekommen ist und nicht in einer lustigen Endlosschleife zum Mittagessen geschickt wurde - als Bitte, mich zu verlassen, geht es mir gut, aber das kann einige Zeit dauern. ' interaktive Nachricht - wie ein Fortschrittsbalken im Text.

Der print('Skimming for', search_string, '\b! .001', end='')initialisiert die Nachricht, indem er sich auf den nächsten Bildschirmschreibvorgang vorbereitet, bei dem drei Leerzeichen als ⌫⌫⌫ Rubout und dann ein Punkt gedruckt werden, wobei '001' gelöscht und die Periodenzeile erweitert wird. Nach der search_stringBenutzereingabe von Papageien \b!schneidet das Ausrufezeichen meines search_stringTextes zu, um über das Leerzeichen zu gelangen, das print()sonst erzwungen wird, und platziert die Interpunktion richtig. Darauf folgt ein Leerzeichen und der erste 'Punkt' des 'Fortschrittsbalkens', den ich simuliere. Unnötig ist, dass die Nachricht dann auch mit der Seitenzahl (formatiert auf eine Länge von drei mit führenden Nullen) versehen wird, um den Benutzer darauf aufmerksam zu machen, dass der Fortschritt verarbeitet wird und dass dies auch die Anzahl der Perioden widerspiegelt, die wir später für die erstellen werden Recht.

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 Progress Bar Fleisch ist in der sys.stdout.write('\b\b\b.'+format(page, '03'))Linie. Zum Löschen nach links wird zunächst der Cursor über den drei numerischen Zeichen mit dem '\ b \ b \ b' als ⌫⌫⌫ Rubout gesichert und ein neuer Punkt gelöscht, um die Länge des Fortschrittsbalkens zu erhöhen. Dann schreibt es drei Ziffern der Seite, auf die es bisher fortgeschritten ist. Da darauf sys.stdout.write()gewartet wird, dass ein voller Puffer oder der Ausgangskanal geschlossen wird, sys.stdout.flush()wird das sofortige Schreiben erzwungen. sys.stdout.flush()ist eingebaut, in dessen Ende mit print()umgangen wird print(txt, end='' ). Dann durchläuft der Code seine alltäglichen zeitintensiven Operationen, während er nichts mehr druckt, bis er hierher zurückkehrt, um drei Ziffern zurückzuwischen, einen Punkt hinzuzufügen und erneut drei Ziffern zu schreiben, inkrementiert.

Die drei Ziffern, die gelöscht und neu geschrieben wurden, sind keineswegs notwendig - es ist nur ein Schnörkel, der beispielhaft für sys.stdout.write()Versus steht print(). Sie können genauso gut mit einem Punkt beginnen und die drei ausgefallenen Backslash-b-Backspaces vergessen (natürlich auch keine formatierten Seitenzahlen schreiben), indem Sie den Periodenbalken jedes Mal um eins länger durchdrucken - ohne Leerzeichen oder Zeilenumbrüche, indem Sie nur den Punkt verwenden sys.stdout.write('.'); sys.stdout.flush()Paar.

Bitte beachten Sie, dass die Raspberry Pi IDLE3 Python-Shell die Rücktaste nicht als ⌫ Rubout berücksichtigt, sondern stattdessen ein Leerzeichen druckt und stattdessen eine scheinbare Liste von Brüchen erstellt.

- (o = 8> wiz


4

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

Sie könnten eine Funktion wie definieren

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. Sogar es akzeptiert alle anderen Parameter wie Datei, Flush usw. und mit demselben Namen.


Es läuft nicht, es beschwert sich, dass *arges am Anfang ist (Python 2.7), und es am Ende zu setzen lief, funktionierte aber nicht ganz richtig. Ich habe eine Funktion definiert, die nur verwendet wurde Print(*args), und dann nur print with aufgerufen sep='', end=''. Und jetzt funktioniert es wie ich will. Also eine Gegenstimme für die Idee.
Otzen

4

Viele dieser Antworten scheinen etwas kompliziert zu sein. In Python 3.x machen Sie einfach Folgendes:

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

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


3

Sie möchten etwas für die rechte Schleife drucken, aber Sie möchten 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

aber du willst, dass es so gedruckt wird: hi hi hi hi hi hi richtig ???? Fügen Sie einfach ein Komma hinzu, nachdem Sie "hi" gedruckt haben.

Beispiel:

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


5
Nein, das OP will hihihihihi, nicht hi hi hi hi hi
Cool Javelin

1

Oder haben Sie eine Funktion wie:

def Print(s):
   return sys.stdout.write(str(s))

Dann jetzt:

for i in range(10): # or `xrange` for python 2 version
   Print(i)

Ausgänge:

0123456789

0
for i in xrange(0,10): print '\b.',

Dies funktionierte sowohl in 2.7.8 als auch in 2.5.2 (Canopy- bzw. OSX-Terminal) - keine Modulimporte oder Zeitreisen erforderlich.


8
Dadurch werden Rücktaste in die Standardausgabe gedruckt. Es sieht möglicherweise korrekt aus, wenn die Standardausgabe zufällig ein Terminal ist, aber wenn sie in eine Datei umgeleitet wird, enthält diese Datei Steuerzeichen.
Keith Thompson

1
Stimmt, aber ich kann mir nicht vorstellen, dass irgendjemand dies für etwas anderes als einen Low-Tech-Fortschrittsbalken verwenden
möchte

1
Trotzdem macht der Python-Code nicht dasselbe wie der C-Code in der Frage.
Keith Thompson

Sie können mit testen, sys.stdout.isatty()wenn Sie nicht in eine Datei umgeleitet werden.
fcm

0

Es gibt zwei Möglichkeiten, dies zu tun:

Drucken ohne Zeilenumbruch in Python 3.x.

Fügen Sie nach der print-Anweisung nichts hinzu und entfernen Sie '\ n' mit end='' :

>>> print('hello')
hello  # appending '\n' automatically
>>> print('world')
world # with previous '\n' world comes down

# solution is:
>>> print('hello', end='');print(' world'); # end with anything like end='-' or end=" " but not '\n'
hello world # it seem correct output

Ein weiteres Beispiel in Loop :

for i in range(1,10):
    print(i, end='.')

Drucken ohne Zeilenumbruch in Python 2.x.

Das Hinzufügen eines nachgestellten Kommas besagt, dass nach dem Drucken ignoriert wird \n.

>>> print "hello",; print" world"
hello world

Ein weiteres Beispiel in Loop :

for i in range(1,10):
    print "{} .".format(i),

Hoffe das wird dir helfen. Sie können diesen Link besuchen .


Was ist mit dem Raum?
Spitzmaus

benutze end=" "zB: print ('hallo', end = '' "); print ('world')
susan097

Ihre 2.7-Lösung entfernt den Speicherplatz nicht.
Spitzmaus

Ich erwähne, dass '\ n' nicht Speicherplatz entfernen, Speicherplatz ist in Python2 standardmäßig. Sehen Sie, wie das aussieht: print 'hello' ;print'there'in paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Richtig, deshalb wurde Ihre Antwort abgelehnt. Sie haben die Frage "Wie drucke ich ohne Zeilenumbruch oder Leerzeichen?" Nicht beantwortet. Ihre Antwort für 2.x beantwortet die Frage nicht. Ihre Antwort für 3.0 ist dieselbe wie für viele andere Antworten, die vor über neun Jahren veröffentlicht wurden. Einfach ausgedrückt, diese Antwort fügt der Community nichts Nützliches hinzu und Sie sollten sie löschen.
Spitzmaus

-3

... Sie müssen keine Bibliothek importieren. Verwenden Sie einfach das Löschzeichen:

BS=u'\0008' # the unicode for "delete" character
for i in range(10):print(BS+"."),

Dadurch werden die neue Zeile und das Leerzeichen (^ _ ^) * entfernt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.