CSV - Python schreibt nur einmal

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Simon.M
User
Beiträge: 11
Registriert: Freitag 19. November 2021, 18:45

Ich habe mir ein kleines Script geschrieben, welches einen Aktienkurs simulieren soll.
Der Code dazu sieht so aus:

Code: Alles auswählen

import random
import logging
import csv
import time
wert = 10000
invest = 1000
money = 0

for i in range(365):
    newwert = random.randint(-1000, 1000)
    wert = wert + newwert
    if newwert >= 0:
        gewinn = (newwert/8)
        money = money + gewinn
        print("Money:", int(money), "Wert:", int(wert))
        with open('Stonks.csv', 'w', newline='\r\n') as file:
            writer = csv.writer(file)
            writer.writerow(["Money", "Wert"])
            writer.writerow([int(money), int(wert)])
            time.sleep(0.1)
    elif newwert <= 0:
        gewinn = (newwert/8)
        money = money - (-1*(gewinn))
        print("Money:", int(money), "Wert:", int(wert))
        with open('Stonks.csv', 'w', newline='\r\n') as file:
            writer = csv.writer(file)
            writer.writerow(["Money", "Wert"])
            writer.writerow([int(money), int(wert)])
            time.sleep(0.1)
print(int(money))
print(int(invest) + int(money))
Wie man sieht soll der Wert der Aktie + das aktuell verdiente Geld in eine CSV Datei geschrieben werden.
Führe ich das Programm aus wird nur der erste Wert geschrieben.
Ich verstehe nicht woran das liegt. Sollte ich dem Programm mehr Zeit zum schreiben geben?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Eine Datei, die du mit dem Attribut "w" öffnest, wird komplett überschrieben.
Wenn du also 365 Mal die Datei Datei so öffnest und eine Zeile hinein schreibst, dann hast du am Ende genau 1 Zeile darin stehen.

Du musst also entweder die Schleifen in den with-Block verschieben oder die Werte sammeln und am Ende in die Datei schreiben.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Falsch, zum Schluß steht nur der letzte Wert in der Datei, weil Du die Dateien immer wieder überschreibst.
Die Datei öffnet man nur einmal außerhalb der Schleife. Genauso darf man nur einmal den Header schreiben.
Wenn der Code im if- und im else-Block der selbe ist, dann braucht man den nur einmal schreiben.
Ein - (-1 * gewinn) gibt doch nur wieder + gewinn. Damit sind die zwei if-Zweige absolut identisch!

Code: Alles auswählen

import random
import csv
import time

def main():
    wert = 10000
    invest = 1000
    money = 0

    with open('Stonks.csv', 'w', newline='\r\n') as file:
        writer = csv.writer(file)
        writer.writerow(["Money", "Wert"])
        for i in range(365):
            newwert = random.randint(-1000, 1000)
            wert += newwert
            gewinn = newwert / 8
            money += gewinn
            print("Money:", int(money), "Wert:", int(wert))
            writer.writerow([int(money), int(wert)])
            time.sleep(0.1)
    print(int(money))
    print(int(invest) + int(money))

if __name__ == "__main__":
    main()
Simon.M
User
Beiträge: 11
Registriert: Freitag 19. November 2021, 18:45

Ok verstehe hätte ich selber drauf kommen können
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da ist ein kleiner Fehler drin, also schon im Original: Das `newline`-Argument muss auf "", also die leere Zeichenkette gesetzt werden. Siehe Dokumentation vom `csv`-Modul.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten