String in .txt Datei schreiben funktioniert nicht richtig

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
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Ich habe folgendes Programm geschrieben

Code: Alles auswählen

n1 = 5
n2 = 9
Punkte = (n1 + n2)*2

datei = open('textdatei.txt','a')

for i in range(Punkte):
    
    Punkt = 43+i

    a = "asm_const_grid_extract_v1- +",Punkt,", +Construct 2PointCurve-Evaluate Geometry-+ // @"
    
    
    datei.write("\n"+str(a))
    
datei.close()
und als Aufgabe bekomme ich

Code: Alles auswählen

('asm_const_grid_extract_v1- +', 43, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 44, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 45, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 46, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 47, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 48, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 49, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 50, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 51, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 52, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 53, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 54, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 55, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 56, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 57, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 58, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 59, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 60, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 61, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 62, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 63, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 64, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 65, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 66, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 67, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 68, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 69, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
('asm_const_grid_extract_v1- +', 70, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
Was jetzt nicht passt sind folgende Sachen (unten auch farblich markiert)
-Die ganze Zeile soll nicht in Kommas stehen,
-die Gänsefüßchen ' sollen nirgends sein,
-das Leerzeichen vor der fortlaufenden Zahl und die Kommas darum sollen nicht da sein
Eigentlich soll es folgendermaßen aussehen (oben falsch, unten richtig)

Code: Alles auswählen

('asm_const_grid_extract_v1- +', 43, '+, +Construct 2PointCurve-Evaluate Geometry-+ // @')
asm_const_grid_extract_v1- +43+, +Construct 2PointCurve-Evaluate Geometry-+ // @
malzbier
User
Beiträge: 13
Registriert: Mittwoch 25. November 2020, 09:42

Bei
a = "asm_const_grid_extract_v1- +",Punkt,", +Construct 2PointCurve-Evaluate Geometry-+ // @"

liegt der Fehler. Wenn du einen String verbinden willst, machst du es nicht mit ',' sonder mit '+'

a = "asm_const_grid_extract_v1- +" + str(Punkt) + "+, +Construct 2PointCurve-Evaluate Geometry-+ // @"
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Anstatt `+` sollte man besser Stringformatierung benutzen, um Strings zu erstellen. Das ist besser lesbar, man spart sich das explizite Umwandeln mit `str()`, und es ist performanter:

Code: Alles auswählen

def main():
    n1 = 5
    n2 = 9
    points_count = (n1 + n2) * 2
    offset = 43

    with open("textdatei.txt", "a") as file:
        for point in range(offset, points_count + offset):
            file.write(f"asm_const_grid_extract_v1- +{point}+, +Construct 2PointCurve-Evaluate Geometry-+ // @\n")


if __name__ == "__main__":
    main()
Sonstige Anmerkungen: `n1` und `n2` sind keine guten Namen, weil sie nicht beschreiben, was die Werte bedeuten.

Benutzte `with`, um Dateien zu öffnen. Das stellt sicher, dass die Datei am Ende auch sicher wieder geschlossen wird und alle Daten geschrieben wurden.

Das Zeilenende ist ein... Zeilenende und gehört damit ans Ende der Zeile, nicht an den Anfang (sonst hast du eine leere Zeile am Anfang der Datei und die letzte Zeile hat kein Zeilenende).

Code sollte nicht auf Modulebene stehen, sondern zumindest in einer `main`-Funktion, die durch das `if __name__ == "__main__"`-Idiom aufgerufen wird. Damit vermeidet man globale Variablen und alle Flüchtigkeitsfehler, die man sich damit einhandelt.
NinoBaumann
User
Beiträge: 72
Registriert: Samstag 25. April 2020, 19:03

Hallo narpfel,

vielen dank für die hilfreichen Tipps und natürlich den Code!!!!

Grüße
Nino
Benutzeravatar
__blackjack__
User
Beiträge: 13118
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@NinoBaumann: Und noch die Info was da passiert ist: Du hast da Tupel erstellt und die in Zeichenketten umgewandelt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten