Tabellen als Text
Eine CSV-Datei (comma-separated values) speichert eine Tabelle als Text: eine Zeile pro Datensatz, Zellen durch Kommas getrennt, meist mit einer Kopfzeile, die die Spalten benennt. Kurshistorien, Trade-Blotter und Exporte fast jedes Werkzeugs kommen so daher. Mit line.split(",") scheint das Parsen einfach, aber eine Zelle kann selbst ein Komma enthalten und steht dann in Anführungszeichen: AAPL,"Q3, adjusted". Von Hand zu teilen scheitert daran, nutzen Sie also das Standardmodul csv und öffnen Sie die Datei mit newline="", damit Zeilenumbrüche in Zellen richtig behandelt werden.
import csv
# Write a small table with csv.writer
with open("prices.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["date", "symbol", "close", "note"])
writer.writerow(["2025-01-02", "AAPL", 184.25, "Q3, adjusted"])
writer.writerow(["2025-01-03", "AAPL", 185.5, ""])
# The comma inside the note is quoted for us
with open("prices.csv", encoding="utf-8") as file:
print(file.read().splitlines()[1]) # 2025-01-02,AAPL,184.25,"Q3, adjusted"Zeilen lesen
csv.reader(file) liefert jede Zeile als Liste von Strings. csv.DictReader(file) liest zuerst die Kopfzeile und liefert dann jede Zeile als Dictionary mit den Spaltennamen als Schlüsseln, was besser lesbar ist und eine Umsortierung der Spalten übersteht. In beiden Fällen ist jede Zelle Text: Wandeln Sie vor dem Rechnen mit float(...) oder int(...) um. Übergeben Sie delimiter=";" (oder "\t") für Dateien mit anderem Trennzeichen.
import csv
# DictReader gives each row as a dict; cells are strings
closes = []
with open("prices.csv", newline="", encoding="utf-8") as file:
for row in csv.DictReader(file):
closes.append(float(row["close"]))
print(closes) # [184.25, 185.5]
# csv.reader gives plain lists, header included
with open("prices.csv", newline="", encoding="utf-8") as file:
rows = list(csv.reader(file))
print(rows[0]) # ['date', 'symbol', 'close', 'note']
print(rows[1]) # ['2025-01-02', 'AAPL', '184.25', 'Q3, adjusted']Zeilen schreiben
csv.writer(file).writerow(values) schreibt eine Zeile und setzt bei Bedarf Anführungszeichen; Zahlen werden für Sie in Text umgewandelt. csv.DictWriter(file, fieldnames=[...]) schreibt Dictionaries, und writeheader() schreibt zuerst die Spaltennamen. Öffnen Sie die Datei mit "w" und newline=""; ohne newline="" können unter Windows Leerzeilen zwischen den Zeilen entstehen.
import csv
# DictWriter: header first, then one dict per row
trades = [{"symbol": "AAPL", "quantity": 200}, {"symbol": "MSFT", "quantity": 50}]
with open("trades.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["symbol", "quantity"])
writer.writeheader()
writer.writerows(trades)
with open("trades.csv", encoding="utf-8") as file:
print(file.read().splitlines()) # ['symbol,quantity', 'AAPL,200', 'MSFT,50']import csv
# Cells are text until you convert them
with open("prices.csv", newline="", encoding="utf-8") as file:
row = next(csv.DictReader(file))
print(repr(row["close"]), row["close"] * 2) # '184.25' 184.25184.25
print(float(row["close"]) * 2) # 368.5
# Another separator: semicolons
with open("euro.csv", "w", newline="", encoding="utf-8") as file:
csv.writer(file, delimiter=";").writerow(["AAPL", "184,25"])
with open("euro.csv", newline="", encoding="utf-8") as file:
print(next(csv.reader(file, delimiter=";"))) # ['AAPL', '184,25']184.25, 200 und AAPL sind nur Zeichen, bis Sie sie umwandeln. Vergisst man das, erhält man "184.25" * 200 (der Text 200-mal wiederholt) statt eines Fehlers. Wandeln Sie jede Spalte einmal um, direkt beim Lesen, und prüfen Sie die Namen der Kopfzeile, statt Positionen anzunehmen.- Mit
newline=""öffnen; CSV-Zeilen nicht von Hand teilen oder zusammensetzen. csv.DictReaderliest Zeilen als Dictionaries; jede Zelle ist ein String.csv.writer/csv.DictWriterschreiben Zeilen und setzen die Anführungszeichen für Sie.
Als Nächstes: JSON-Daten, für verschachtelte Datensätze, die nicht in eine flache Tabelle passen.
Lab: Was bewertet wird
- Mit
read_closesSchlusskurse nach Symbol gruppieren25 Pkt. - Mit
write_tradesTrades als CSV-Datei speichern25 Pkt. - Mit
total_by_symbolden gehandelten Wert je Symbol summieren25 Pkt. - Mit
filter_rowsdie Zeilen eines Symbols in eine neue Datei kopieren25 Pkt.