@xBieneMaja: Ein paar Anmerkungen zu dem Quelltext:
Pfadteile setzt man nicht mit ``+`` zusammen. Für Operationen auf Pfaden gibt es `pathlib.Path`.
Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.
`beschriftung` ist in der Einzahl kein guter Name für eine Liste, denn da ist ja nicht nur eine Beschriftung drin sondern mehrere.
Die Schleife um die Datensätze aus dem CSV-Reader in die Liste zu übertragen kann man sich sparen in dem man einfach `list()` mit dem Reader-Objekt als Argument aufruft.
Statt am Ende die gesamte Liste ohne das erste Element zu kopieren, würde man den ersten Datensatz beim einlesen schon überspringen.
Es gibt zwei Schleifen über die Datensätze wo aus jedem Datensatz die Werte herausgepickt werden und man sieht, dass nicht alle Spalten verwendet werden. Das heisst man kann die Daten schon beim Einlesen schon auf das nötige und eine passende Reihenfolge reduzieren.
``for col in range(len(beschriftungen))`` ist ein „anti pattern“ in Python. Man kann direkt über die Elemente von `beschriftungen` iterieren, ohne den unnötigen Umweg über einen Laufindex. Der Name `col` ist auch sehr verwirrend, denn das ist ein Index für die Tabellen*zeilen*, `col` klingt aber nach einer Abkürzung für `column` was aber Spalte bedeutet, also genau die andere ”Richtung”.
`save` ist kein guter Name für eine Liste. Das ist ja ein Verb und beschreibt eine Tätigkeit. Ist also ein Name den man einer Funktion oder Methode geben würde, aber keinem passiven Ding.
Der Inhalt ist auch etwas schräg: Listen die immer genau *ein* Element enthalten. Und beim Speichern am Ende wird dann aus jeder dieser Listen dieses *eine* Element heraus geholt. Das macht keinen Sinn Elemente noch mal ein eine einelementige Liste zu verpacken. Das ist unnötiger Verpackungsmüll.
Das als einzelne Zeilen zu handhaben ist auch umständlicher als es sein müsste. Das sind insgesamt zwei grössere Textblöcke mit Platzhaltern, die man auch so also Konstanten am Anfang definieren könnte und dann in zwei Listen in *einem* Durchlauf über die Datensätze die ausgefüllten Textblöcke sammeln. Dann braucht man die Eingabedaten gar nicht zuerst einmal komplett in den Speicher laden.
Für den zweiten Teil der Ausgabedatei fehlt mir das Domänenwissen wie man die Vorlage und die Liste zum sammeln der Ergebnisse am besten nennt. Darum die entsprechenden Namen im folgenden (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import csv
from pathlib import Path
PATH = Path(R"C:\Users\user\Desktop\Nico_Beschriftungsprogramm192911\Orginale")
ENCODING = "ascii"
ZYKLUS_VORLAGE = """\
CYCL DEF 225 GRAVIEREN ~
QS500="{text}" ;GRAVIERTEXT ~
Q513=+5 ;ZEICHENHOEHE ~
Q514=+0 ;FARTOR ABSTAND ~
Q515=+0 ;SCHRIFTART ~
Q516=+0 ;TEXTANORDNUNG ~
Q374=+0 ;DREHLAGE ~
Q517=+50 ;KREISRADIUS ~
Q207= AUTO ;VORSCHUB FRAESEN ~
Q201=-2 ;TIEFE ~
Q206= AUTO ;VORSCHUB TIEFENZ. ~
Q200=+2 ;SICHERHEITS-ABST. ~
Q203=+0 ;KOOR. OBERFLAECHE ~
Q204=+50 ;2. SICHERHEITS-ABST.
CALL LBL 1{hole}
"""
BRAUCHT_EINEN_NAMEN_VORLAGE = """\
LBL 1{hole}
L X {x} Y{y} Z +2 RO F MAX M99 ;Bohrung {hole}
LBL 0
"""
def main():
with (PATH / "Beschriftung.csv").open(
encoding=ENCODING, newline=""
) as file:
reader = csv.reader(file, delimiter=";")
next(reader) # Kopfzeile überspringen.
beschriftungen = (
{"hole": row[0], "text": row[7], "x": row[2], "y": row[3]}
for row in reader
)
zyklus_texte = []
bitte_passenden_namen_finden = []
for beschriftung in beschriftungen:
zyklus_texte.append(ZYKLUS_VORLAGE.format_map(beschriftung))
bitte_passenden_namen_finden.append(
BRAUCHT_EINEN_NAMEN_VORLAGE.format_map(beschriftung)
)
with (PATH / "NC_Code.h").open("a", encoding=ENCODING) as file:
for text_bloecke in [zyklus_texte, bitte_passenden_namen_finden]:
file.writelines(text_bloecke)
if __name__ == "__main__":
main()