Python / print() / Werte als Text ausgeben

Pythons print() wandelt Werte in Text um und schreibt normalerweise auf die Standardausgabe. Zwischen mehreren Werten stehen Leerzeichen, am Ende ein Zeilenumbruch. sep, end, file und flush steuern das Verhalten. Die Rückgabe ist None, nicht der ausgegebene Text.

Grundausgabe und Anführungszeichen

Die Signatur lautet print(*objects, sep=' ', end='\n', file=None, flush=False). *objects erlaubt mehrere Werte. Ohne explizites file verwendet die Funktion die Standardausgabe sys.stdout, gewöhnlich Terminal oder IDE-Ausgabefenster. Argumentregeln stehen in der print()-Referenz.

Verwenden Sie Python 3. Speichern Sie jedes vollständige Beispiel als print_example.py in UTF-8 und führen Sie python print_example.py beziehungsweise python3 aus. Ersetzen Sie den Inhalt für unabhängige Versuche.

print("Hello")
print('Hello')
print("'Hello'")
print('"Hello"')
print("count", 3, True, None)

Erwartete Ausgabe:

Hello
Hello
'Hello'
"Hello"
count 3 True None

Einfache und doppelte Anführungszeichen begrenzen Strings; die Begrenzung wird nicht gedruckt. Um Anführungszeichen selbst auszugeben, umschließen Sie sie mit der anderen Art. Mehrere Argumente erlauben Zahlen und Strings ohne Verkettung durch +. print() ohne Werte erzeugt nur den standardmäßigen Zeilenumbruch.

sep trennt Werte, end beendet den Aufruf

sep steht zwischen Argumenten desselben Aufrufs, end hinter dessen letztem Wert. end="" lässt den Zeilenumbruch weg; end=" " verbindet die nächste Ausgabe durch ein Leerzeichen.

print("A", "B", sep="-", end=" | ")
print("C")
values = ["A", "B"]
print(values, sep="-")
print(*values, sep="-")
A-B | C
['A', 'B']
A-B

Der erste Aufruf schreibt A-B | , danach folgt C in derselben Zeile. Eine Liste als einzelnes Argument wird als Liste dargestellt; sep verändert ihre innere Formatierung nicht. Mit *values übergeben Sie Elemente einzeln. Ohne die betreffende Option gilt wieder ihr Standard.

Formatierung und Rückgabewert unterscheiden

Für Dezimalstellen und Satzaufbau erstellen Sie zunächst einen String. Das Beispiel nutzt das f-String-Format :.2f für zwei Nachkommastellen.

price = 12.5
quantity = 3
message = f"Total: {price * quantity:.2f}"
result = print(message)
print(result)
Total: 37.50
None

message enthält den Text; result bekommt None. Soll eine Funktion Rechenergebnisse an weiteren Code übergeben, verwenden Sie return und überlassen die Anzeige dem Aufrufer. Zwei dargestellte Nachkommastellen verändern nicht die Präzision des ursprünglichen Zahlenwerts.

Mit file in eine UTF-8-Datei schreiben

file erwartet ein beschreibbares Textdateiobjekt. Dieses vollständige Beispiel liest und schreibt report.txt in einem temporären Ordner, berührt keine vorhandenen Dateien und räumt anschließend auf. Zusätzliche Pakete sind unnötig.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "report.txt"
    with path.open("w", encoding="utf-8") as output:
        print("Alpha", 10, file=output)
    with path.open("a", encoding="utf-8") as output:
        print("Beta", 20, file=output)
    print(path.read_text(encoding="utf-8"), end="")
Alpha 10
Beta 20

"w" schreibt neu und leert eine vorhandene Datei; "a" hängt an. Jeder with-Block schließt seine Datei. Das abschließende end="" vermeidet einen weiteren Zeilenumbruch zu den bereits gelesenen. Prüfen Sie vor realen Dateien Pfade, Schreibrechte und Dateimodi und Kodierung.

Text erfassen und TypeError verstehen

StringIO verhält sich wie eine Textdatei im Speicher. Übergeben Sie file=output, um vorhandene Ausgabefunktionen zu verwenden, und lesen Sie vor dem Schließen mit getvalue(). Für einen einzelnen Satz ist ein f-String direkter.

from io import BytesIO, StringIO

with StringIO() as output:
    print("A", "B", sep="-", file=output)
    text = output.getvalue()
print(repr(text))

try:
    print("A", "B", sep=1)
except TypeError:
    print("TypeError: sep")

with BytesIO() as output:
    try:
        print("text", file=output)
    except TypeError:
        print("TypeError: binary stream")
'A-B\n'
TypeError: sep
TypeError: binary stream

Das durch repr() sichtbare \n ist der erfasste Zeilenumbruch. sep und end müssen Strings oder None für den Standard sein; Zahlen sind ungültig. Der Binärstream BytesIO kann die Textschreibvorgänge von print() nicht annehmen. Kodieren Sie Text ausdrücklich und verwenden Sie für Binärdaten eine binäre Schreib-API.

Fortschritt ohne Zeilenumbruch mit flush

Ausgaben können vor der Weitergabe gepuffert werden. Fortschritt ohne Zeilenumbruch sowie Datei- oder Pipe-Ausgaben erscheinen deshalb möglicherweise später als erwartet. flush=True fordert das Ausgabeziel auf, seinen Puffer zu leeren.

for number in range(3):
    print(number, end=" ", flush=True)
print("done")
0 1 2 done

Die endgültigen Zeichen entsprechen der Ausgabe oben; der Aktualisierungszeitpunkt hängt von Terminal, IDE und Ziel ab. flush fügt keine neue Zeile hinzu, löscht keinen Bildschirm und garantiert keine dauerhafte Speicherung auf dem Datenträger. Nutzen Sie sonst Standardwerte und fordern Sie das Leeren gezielt für Zwischenanzeigen an.