Einführung
Dieser Abschnitt ist ein kleiner Ausflug, aber wenn Sie mit Daten arbeiten, möchten Sie oft strukturierte Ausgabe (Tabellen usw.) erzeugen. Beispielsweise:
Name Anteile Preis
---------- ---------- -----------
AA 100 32,20
IBM 50 91,10
CAT 150 83,44
MSFT 200 51,23
GE 95 40,37
MSFT 50 65,10
IBM 100 70,44
String Formatierung
Eine Möglichkeit, Zeichenketten in Python 3.6+ zu formatieren, sind f-Strings.
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
' IBM 100 91.10'
>>>
Der Teil {expression:format} wird ersetzt.
Es wird häufig mit print verwendet.
print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
Formatcodes
Formatcodes (nach dem : innerhalb der {}) ähneln denen von C printf(). Gemeinsame Codes sind:
d Dezimalzahl als Ganzzahl
b Binäre Zahl als Ganzzahl
x Hexadezimale Zahl als Ganzzahl
f Gleitkommazahl als [-]m.dddddd
e Gleitkommazahl als [-]m.dddddde+-xx
g Gleitkommazahl, aber selektive Verwendung von E-Notation
s Zeichenkette
c Zeichen (aus Ganzzahl)
Gemeinsame Modifikatoren passen die Feldbreite und die Dezimalgenauigkeit an. Dies ist eine Teilliste:
:>10d Ganzzahl rechtsbündig in einem 10-Zeichen-Feld
:<10d Ganzzahl linksbündig in einem 10-Zeichen-Feld
:^10d Ganzzahl zentriert in einem 10-Zeichen-Feld
:0.2f Gleitkommazahl mit 2-stelliger Genauigkeit
Dictionary Formatierung
Sie können die format_map()-Methode verwenden, um die Zeichenkettenformatierung auf ein Wörterbuch von Werten anzuwenden:
>>> s = {
'name': 'IBM',
'shares': 100,
'price': 91.1
}
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)
' IBM 100 91.10'
>>>
Es verwendet die gleichen Codes wie f-Strings, nimmt jedoch die Werte aus dem angegebenen Wörterbuch.
format()-Methode
Es gibt eine Methode format(), die Formatierung auf Argumente oder Schlüsselwortargumente anwenden kann.
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)
' IBM 100 91.10'
>>> '{:>10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)
' IBM 100 91.10'
>>>
Ehrlich gesagt, format() ist etwas umständlich. Ich ziehe f-Strings vor.
C-Style Formatierung
Sie können auch den Formatierungsoperator % verwenden.
>>> 'The value is %d' % 3
'The value is 3'
>>> '%5d %-5d %10d' % (3,4,5)
' 3 4 5'
>>> '%0.2f' % (3.1415926,)
'3.14'
Dies erfordert einen einzelnen Wert oder ein Tupel auf der rechten Seite. Die Formatcodes sind ebenfalls nach der C printf() modelliert.
Hinweis: Dies ist die einzige verfügbare Formatierung für Byte-Strings.
>>> b'%s has %d messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>> b'%b has %d messages' % (b'Dave', 37) ## %b kann anstelle von %s verwendet werden
b'Dave has 37 messages'
>>>
Übung 2.8: Wie man Zahlen formatiert
Ein häufiges Problem bei der Ausgabe von Zahlen ist die Angabe der Anzahl der Nachkommastellen. Eine Möglichkeit, dieses Problem zu beheben, ist die Verwendung von f-Strings. Probieren Sie diese Beispiele aus:
>>> value = 42863.1
>>> print(value)
42863.1
>>> print(f'{value:0.4f}')
42863.1000
>>> print(f'{value:>16.2f}')
42863.10
>>> print(f'{value:<16.2f}')
42863.10
>>> print(f'{value:*>16,.2f}')
*******42,863.10
>>>
Die vollständige Dokumentation zu den im f-Strings verwendeten Formatcodes finden Sie hier. Die Formatierung wird manchmal auch mit dem %-Operator von Zeichenketten durchgeführt.
>>> print('%0.4f' % value)
42863.1000
>>> print('%16.2f' % value)
42863.10
>>>
Die Dokumentation zu den verschiedenen Codes, die mit % verwendet werden, finden Sie hier.
Obwohl es üblicherweise mit print verwendet wird, ist die Zeichenkettenformatierung nicht an das Ausgeben gebunden. Wenn Sie eine formattierte Zeichenkette speichern möchten, weisen Sie sie einfach einer Variablen zu.
>>> f = '%0.4f' % value
>>> f
'42863.1000'
>>>
Übung 2.9: Daten sammeln
In Übung 2.7 haben Sie ein Programm namens report.py geschrieben, das den Gewinn/Verlust eines Aktienportfolios berechnet hat. In dieser Übung werden Sie es nun so modifizieren, dass eine Tabelle wie diese erzeugt wird:
Name Anteile Preis Änderung
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
In diesem Bericht ist "Preis" der aktuelle Aktienpreis und "Änderung" die Änderung des Aktienpreises gegenüber dem ursprünglichen Kaufpreis.
Um den obigen Bericht zu generieren, müssen Sie zunächst alle in der Tabelle gezeigten Daten sammeln. Schreiben Sie eine Funktion make_report(), die eine Liste von Aktien und ein Wörterbuch von Preisen als Eingabe nimmt und eine Liste von Tupeln zurückgibt, die die Zeilen der obigen Tabelle enthalten.
Fügen Sie diese Funktion zur Datei report.py hinzu. So sollte es funktionieren, wenn Sie es interaktiv testen:
>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> prices = read_prices('/home/labex/project/prices.csv')
>>> report = make_report(portfolio, prices)
>>> for r in report:
print(r)
('AA', 100, 9.22, -22.980000000000004)
('IBM', 50, 106.28, 15.180000000000007)
('CAT', 150, 35.46, -47.98)
('MSFT', 200, 20.89, -30.339999999999996)
('GE', 95, 13.48, -26.889999999999997)
...
>>>
Übung 2.10: Ausgabe einer formatierten Tabelle
Wiederholen Sie die for-Schleife in Übung 2.9, aber ändern Sie den print-Befehl, um die Tupel zu formatieren.
>>> for r in report:
print('%10s %10d %10.2f %10.2f' % r)
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Sie können auch die Werte erweitern und f-Strings verwenden. Beispielsweise:
>>> for name, shares, price, change in report:
print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Nehmen Sie die obigen Anweisungen und fügen Sie sie Ihrem report.py-Programm hinzu. Lassen Sie Ihr Programm die Ausgabe der make_report()-Funktion entgegennehmen und geben Sie eine schön formatierte Tabelle wie gezeigt aus.
Übung 2.11: Hinzufügen von Kopfzeilen
Angenommen, Sie hätten ein Tupel mit Kopfzeilennamen wie dieses:
headers = ('Name', 'Anteile', 'Preis', 'Änderung')
Fügen Sie Code zu Ihrem Programm hinzu, der das obige Tupel von Kopfzeilen verwendet und eine Zeichenkette erstellt, in der jeder Kopfzeilename rechtsbündig in einem 10-zeichenweiten Feld platziert ist und jedes Feld durch ein einzelnes Leerzeichen getrennt ist.
' Name Anteile Preis Änderung'
Schreiben Sie Code, der die Kopfzeilen verwendet und die Trennzeichenkette zwischen den Kopfzeilen und den folgenden Daten erstellt. Diese Zeichenkette besteht einfach aus einer Reihe von "-"-Zeichen unter jedem Feldnamen. Beispielsweise:
'---------- ---------- ---------- -----------'
Wenn Sie fertig sind, sollte Ihr Programm die Tabelle ausgeben, die am Anfang dieser Übung gezeigt wird.
Name Anteile Preis Änderung
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
Übung 2.12: Formatierungschallenge
Wie würden Sie Ihren Code ändern, sodass der Preis das Währungssymbol ($) enthält und die Ausgabe wie folgt aussieht:
Name Anteile Preis Änderung
---------- ---------- ---------- ----------
AA 100 $9.22 -22.98
IBM 50 $106.28 15.18
CAT 150 $35.46 -47.98
MSFT 200 $20.89 -30.34
GE 95 $13.48 -26.89
MSFT 50 $20.89 -44.21
IBM 100 $106.28 35.84
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Formatierungslabor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.