bereits beschriebene CSV Datei beschreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
VibeXx007
User
Beiträge: 1
Registriert: Montag 27. Februar 2023, 12:40

Hallo zusammen,
ich wollte fragen, wie es möglich ist, eine bereits beschriebene CSV Datei erneut zu beschreiben aber die Daten trotzdem erhalten bleiben und nicht überschrieben werden.
Ich hoffe Ihr versteht mein Problem.
Danke im Voraus!!
Gruß Fabi
with open("mydat1.csv","w") as csv1:
my_csv = csv.writer(csv1, delimiter=" ", lineterminator= '\n')
my_csv.writerow(["Name:"])
my_csv.writerow(mylist1)
my_csv.writerow(["Zeit in Sekunden:"])
my_csv.writerow(mylist2)
Mein kompletter Code für den Context:
import random,csv,time

i,richtig = 0,0
mylist1 = []
mylist2 = []
Name = input("Geben Sie Ihren Namen ein:"" ")
mylist1.append(Name)
#-funktionen--------------------------------------------------------
def Rechenart(Art):
a = random.randint(1,10)
b = random.randint(1,10)
if Art == 1:
print("Die Aufgabe:",a, "+",b)
erg = a+b
return erg
if Art == 2:
print("Die Aufgabe:",a, "-",b)
erg = a-b
return erg
if Art == 3:
print("Die Aufgabe:",a, "*",b)
erg = a*b
return erg
if Art == 4:
print("Die Aufgabe:",a, ":",b)
erg = a/b
erg = round(erg,2)
return erg
if Art == 5:
x = random.randint(1,4)
if x == 1:
erg = a+b
print("Die Aufgabe:",a, "+",b)
return erg
if x == 2:
erg = a-b
print("Die Aufgabe:",a, "-",b)
return erg
if x == 3:
erg = a*b
print("Die Aufgabe:",a, "*",b)
return erg
if x == 4:
erg = a/b
print("Die Aufgabe:",a, ":",b)
return erg
#-------------------------------------------------------------------

def berechnung(erg):
for versuch in range(1,4,1):
try:
z=float(input("Bitte Zahl eingeben:"))
except:
print("Das war keine Zahl")
continue

if z == erg:
print(z,"ist Richtig")
global richtig
richtig+=1
break
elif erg-1 <= z <=erg+1:
print(z,"Du bist nahe dran")
else:
print(z,"ist falsch")
print("Das Ergebnis ist:",erg)
print("Anzahl der Versuche:",versuch)

#-main---------------------------------------------------------------
Art = int(input("Wählen Sie zwischen Adition(1), Substraktion(2), Multiplikation(3), Division(4) oder gemischt(5) aus"))
Wh = int(input("Wie viele Rechnungen wollen Sie machen?"" "))
startzeit = time.time()
for i in range(Wh):
erg = Rechenart(Art)
berechnung(erg)

endzeit = time.time()
differenz = endzeit - startzeit
print("Richtig:",richtig,"von", Wh,"in", differenz,"Sekunden")
print("Ergebnis erziehlt:",time.strftime("%d.%m.%Y %H:%M:%S"))
mylist2.append(differenz)
#-csv---------------------------------------------------------------
with open("mydat1.csv","w",newline='') as csv1:
my_csv = csv.writer(csv1, delimiter=" ", lineterminator= '\n')
my_csv.writerow(["Name:"])
my_csv.writerow(mylist1)
my_csv.writerow(["Zeit in Sekunden:"])
my_csv.writerow(mylist2)

Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

a statt w

Code: Alles auswählen

with open("mydat1.csv","a",newline='') as csv1:
OS: LMDE5 *** Homepage *** Github Seite
Benutzeravatar
sparrow
User
Beiträge: 4514
Registriert: Freitag 17. April 2009, 10:28

@VibeXx007: Bitte poste deinen Code immer in Code-Tags.
Die werden automatisch eingefügt, wenn du den </> Button im vollständigen Editor drückst. Dazwischen gehört dein Code, dann bleibt auch die Einrückung erhalten.

Die importe würde ich in einzelne Zeilen schreiben und nicht mit "," in einer Zeile aufzählen.
Zum Code: Warum haben so viel Namen einen my-Prefix? Gibt es auch your, there, oder other? Wenn nicht, kannst du dir den Prefix sparen.
Weise nicht mehr als einen Wert je Zeile zu, es sei denn, du rufst etwas auf, was mehr als einen Wert zurück liefert.
Namen schreibt man in Python klein_mit_unterstrich. Ausgenommen sind die Namen von Konstanten (KOMPLETT_GROSS) und die Namen von Klassen (PascalCase).
Verwende sprechende, beschreibende Namen. list (wenn man das my weg lässt) ist kein vernünftiger Name, weil niemand (auch du in 2 Tagen) nicht mehr weiß, was darin steht und das erst mühselig zusammensuchen muss. Das gilt auch für Namen wie a, b, x, etc.
Man fängt niemals pauschal Exceptions, sondern ausschließlich die Exceptions die man erwartet und abfangen möchte. Zum einen verschluckt man so Fehlermerldungen, die man vielleicht sehen möchte, zum anderen gibt es dadurch möglicherweise ein unerwartetes Verhalten. Wenn du nach der eingabe einer Zahl fragst, kann ich das Programm nicht mit STR+C beenden. Warum nicht? Klar ist das keine Zahl, aber offensichtlich möchte ich dann auch keine eingeben.

Man teilt nicht zusammengehörige Daten über mehrere Listen auf. Immer wenn man anfängt Namen durchzunummerieren, möchte man wahrscheinlich eine Datenstruktur verwenden. In deinem Fall wäre eine Liste passender, die je Eintrag einen Tuple aus 2 Werten enthält.

Zu deiner CSV-Datei:
Gut ist, dass du das csv-Modul benutzt. Aber warum denn ausgerechnet mit einem Leerzeichen als Trenner? Das ist eine wirklich unglückliche Wahl. Ich würde nach Möglichkeit etwas nutzen, dass man möglichst einfach von den anderen Daten unterscheiden kann. Das "c" steht ja nicht umsonst für das englische "Komma" und auch ein Semikolon ist oft genutzt. Aber ein Leerzeichen kann auch im Namen vorkomen und das halte ich für eine eher schlechte Wahl.
Beim open würde ich, wie in der Dokumentation des csv-Moduls beschrieben, immer newline="" mit angeben und den lineterminator beim reader und writer gar nicht verwenden. Das macht das Modul selbst am besten.

Zu deiner Frage: open kennt verschiedene Modi. Welche sind das?

Edit: Axel war schneller.
Antworten