Konvertieren von proc. in py. Datei

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Kerl90210
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2013, 21:30

Hallo miteinander,

bin Neueinsteiger in der Pythonprogrammierung und wollte fragen, wie ich für die Ausgabe mir:

1. Variablen anlegen kann, um 2 Werte variabel aus der Inputdatei anzupassen.
habe die Funktion replace schon probiert, aber da die Zahl (12.5) kein string ist, funktionierts nicht
2. erscheint in der Ausgabedatei der Befehl:
if __name__ == "__main__":
main()
aus mir unerklärlichen Gründen nicht, weiß jmd. Abhilfe?

Vielen Dank im Voraus.

Code: Alles auswählen

import sys
import string
def main():
    i = open('Eingabe.proc',"r")
    o = open('Ausgabe.py',"w")
    o.write("from py_mentat import *\n")
    o.write("def main():\n")
    for line in i:
        s = line.strip()
        if s == "":
            continue
# print line
        st = "    py_send(\"%s\")\n" % s
        o.write(st)             
if __name__ == "__main__":
    main()
BlackJack

@Kerl90210: Zu 1.: In der Datei sind nunmal Zeichenketten. Wenn Du dort eine Zahl ersetzen willst, musst Du die halt in eine Zeichenkette umwandeln.

Zu 2.: Warum denkst Du die Zeilen müssten in der Ausgabedatei auftauchen? An welcher Stelle im Programm schreibst Du diese Zeilen denn in die Ausgabedatei?

Sonstiges: Diese ein- bis zweibuchstabige Namen sind schlecht. Namen sollen dem Leser vermitteln was der Wert dahinter im Programmkontext bedeutet und ihn nicht zum Rätseln zwingen.

Das `string`-Modul wird importiert, aber nicht verwendet.

Wenn man Dateien mit der ``with``-Anweisung zusammen verwendet, dann ist sichergestellt, dass sie auch wieder geschlossen werden. Was man machen sollte.

Statt die Anführungszeichen selber in der Zeichenkette zu setzen und die Quellzeile mit '%s' einzusetzen würde ich an der Stelle '%r' verwenden. So werden nicht nur die Anführungszeichen gesetzt, sondern es ist auch sichergestellt, dass eventuell in `s` enthaltene Sonderzeichen oder Escape-Sequenzen oder Anführungszeichen entsprechend umgewandelt werden, dass sich ein gültiges Zeichenkettenliteral ergibt.

``continue`` würde ich vermeiden. Das erhöht nur unnötig die Komplexität. Man kann stattdessen einfach die Bedingung umdrehen und den Code der durch das ``continue`` übersprungen wird in dem ``if``-Zweig stecken.
Kerl90210
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2013, 21:30

@ Black Jack: Danke für die nützlichen Infos, habe diese nach bestem Wissen & Gewissen umgesetzt!

Nur steht noch das Problem bzgl. Umschreiben der Variable aus der umgeschriebenen Datei (siehe Variable definieren). Da passiert in der Datei gar nichts obwohl in der Datei: py_send("'12.5'") ausgeschrieben wird.
Weiß jmd. Rat?
Vielen Dank im Voraus.

Code: Alles auswählen

import sys
def main():
    with open('mentat.proc',"r")as Einlesen:
        Schreiben = open('3.py',"w")
        
# Eingabe Beginn
        Schreiben.write("from py_mentat import *\n")
        Schreiben.write("def main():\n")

# Schleife
        for line in Einlesen:
            s = line.strip()
            if s != "":

    # Zeilen schreiben
                st = "    py_send(\"%r\")\n" % s
                Schreiben.write(st)
                
        # Variablen definieren
                if s == str(12.5):
                    '3.py'.replace(str('12.5'),str(12.6))

            elif s == "":
                print("keine Dateien vorhanden")
  
# Eingabe Ende
    Schreiben.write("\n")
    Schreiben.write("if __name__ == '__main__':\n")
    Schreiben.write("    main()\n")
            
if __name__ == "__main__":
    main()

Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kerl90210: »Schreiben« solltest Du auch noch mit »with« öffnen. Sowohl Anführungszeichen \" als auch %r ergeben nun überhaupt keinen Sinn. %r setzt ja schon bei Bedarf die passenden Anführungszeichen.
Kannst Du mal mit eigenen Worten erzählen, was die Zeilen unter "#Variablen definieren" Deiner Meinung nach genau machen?
Kerl90210
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2013, 21:30

@Sirius3:
die if-Bedingung unter variablen definieren soll bewirken, dass wenn in einer Zeile der string: 12.5 erkannt wird, dass dieser durch 12.6 ersetzt wird.

Das war zumindest geplant.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kerl90210: Du schreibst aber schon zwei Zeilen davor, »s« in eine die neue Datei. Der String '3.py' enthält mit Sicherheit nicht den String '12.5' und das Ergebnis der Ersetzung verwirfst Du sowieso gleich wieder.
Kerl90210
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2013, 21:30

Jetzt funzt es,
Vielen Dank!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kerl90210: jetzt sieht's also so aus?

Code: Alles auswählen

TEMPLATE="""from py_mentat import py_send

def main():
{lines}

if __name__ == '__main__':
    main()
"""

def main():
    ersetzung = {
        '12.5': '12.6',
    }
    with open('mentat.proc',"r") as einlesen:
        lines = ["    py_send(%r)\n" % ersetzung.get(line, line)
            for line in (line.strip() for line in einlesen)
            if line]
    with open('3.py','w') as schreiben:
        schreiben.write(TEMPLATE.format(lines=''.join(lines)))
    
if __name__ == "__main__":
    main()
Kerl90210
User
Beiträge: 7
Registriert: Donnerstag 19. Dezember 2013, 21:30

@ Sirius3 Bin so vorgegangen, nach der Musterlösung vergleichend wahrscheinlich viel zu umständlich...

Code: Alles auswählen

import sys
def main():
    with open('mentat.proc',"r")as Einlesen:
        with open('3.py',"w") as Schreiben:
        
# Eingabe Beginn
            Schreiben.write("from py_mentat import *\n")
            Schreiben.write("def main():\n")

# Schleife
            for line in Einlesen:
                s = line.strip()
                if s != "":
                    
        # Variablen definieren
                    UebermassinPromille=1.8
                    DINabe=12.5000*(1-UebermassinPromille/1000)
                    
            # Übermaß in su eingeben mit gleicher Anzahl an Nachkommastellen
                    if s == str('12.5'):
                        su = "    py_send('12.6')\n"
                        Schreiben.write(su)
                        print(DINabe)
        # Zeilen schreiben
                    elif s != str('12.5'):
                        st = "    py_send(%r)\n" % s
                        Schreiben.write(st)
                
                elif s == "":
                    print("keine Dateien vorhanden")
                
# Eingabe Ende
            Schreiben.write("\n")
            Schreiben.write("if __name__ == '__main__':\n")
            Schreiben.write("    main()\n")
            
if __name__ == "__main__":
    main()
Antworten