.PY Datei geht nur einmal

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
xBieneMaja
User
Beiträge: 1
Registriert: Mittwoch 20. Januar 2021, 12:47

Hallo alle zusammen,

ich bin absoluter Neuling und habe folgendes Problem.

Das Programm lief jetzt fast 2 Jahre problemlos. Es wird aus einer .csv Datei eine .h Datei erstellt.
Seit einigen Tagen (ich befürchte nach einem Windows Update ich habe w10) besteht ich folgenden Fehler:

Die .h Datei wird nicht mehr generiert. Also habe ich Python neu installiert mit dem Haken Add to path. Die .py Datei ausgeführt und es wird wieder eine .h Datei erzeugt. Wenn ich die .py Datei wieder benutzen will wird keine .h Datei erzeugt. Nach erneuter Reinstallation funktioniert die Erzeugung wieder genau einmal.

Bild

https://ibb.co/kgqrgNZ verlinkt ist ein bild von dem code


mfg nico
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Bitte poste Code hier im Beitrag. Die Tags werden eingefügt, wenn man den </>-Button im vollständigen Editor klickt.

Was passiert, wenn du die zu erstellende Datei vorher löscht? Gibt es Fehlermeldungen? Wie führst du das Programm aus?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xBieneMaja: Hast Du eventuell eine falsche Erwartungshaltung an das Programm? Wenn die .h-Datei existiert, dann wird die nicht mit den neuen Daten überschrieben, sondern die werden am Ende der existierenden Datei *angehängt*.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code in Bildern ist doof. Da muss man erst OCR-Software bemühen um damit sinnvoll etwas anfangen zu können. 🙂

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import csv



path = "C:\\Users\\user\\Desktop\\Nico_Beschriftungsprogramm192911\\Orginale\\"
file = "Beschriftung.csv"
file_name = path + file 


# Lese "Beschriftung.csv" Zeile fur Zeile in Liste "beschriftung"
beschriftung = []
with open(file_name, newline="") as csvfile:
    reader = csv.reader(csvfile, delimiter=';')
    for row in reader:
        beschriftung.append(row)
beschriftung = beschriftung[1:] # Loesche erste Zeile 


# Erstelle Text
save = []
for col in range(len(beschriftung)): 
    
    hole = beschriftung[col][0]
    text = beschriftung[col][7]
    x = beschriftung[col][2]
    y = beschriftung[col][3] 
    
    zyklus = [
    ["CYCL DEF 225 GRAVIEREN ~"],
    [f"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."],
    [f"CALL LBL 1{hole}"],
    ]
    
    for row in zyklus:
        save.append(row) 


# Erstelle Text
for col in range(len(beschriftung)): 

    hole = beschriftung[col][0]
    text = beschriftung[col][7]
    x = beschriftung[col][2]
    y = beschriftung[col][3] 

    inhalt = [
    [f"LBL  1{hole}"],
    [f"L  X {x} Y{y} Z +2 RO F MAX M99 ;Bohrung {hole}"],
    ["LBL  0"] 
    ]
    
    for row in inhalt:
        save.append(row) 


# Speichere als *.h-Datei
path = "C:\\Users\\user\\Desktop\\Nico_Beschriftungsprogramm192911\\Orginale\\"
nc_file = "NC_Code.h"
nc_file_name = path + nc_file 

with open(nc_file_name, 'a') as file:
    for row in save:
        file.write(str(row[0])+"\n")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten