Strukturierte Datenausgabe für die Datenanalyse

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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)
...
>>>
✨ Lösung prüfen und üben

Ü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.

✨ Lösung prüfen und üben

Ü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
✨ Lösung prüfen und üben

Ü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
✨ Lösung prüfen und üben

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Formatierungslabor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.