Seite 1 von 1

Konvertieren von proc. in py. Datei

Verfasst: Donnerstag 19. Dezember 2013, 23:05
von Kerl90210
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()

Re: Konvertieren von proc. in py. Datei

Verfasst: Freitag 20. Dezember 2013, 01:46
von 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.

Re: Konvertieren von proc. in py. Datei

Verfasst: Samstag 21. Dezember 2013, 22:49
von Kerl90210
@ 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()


Re: Konvertieren von proc. in py. Datei

Verfasst: Samstag 21. Dezember 2013, 23:18
von Sirius3
@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?

Re: Konvertieren von proc. in py. Datei

Verfasst: Sonntag 22. Dezember 2013, 00:12
von Kerl90210
@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.

Re: Konvertieren von proc. in py. Datei

Verfasst: Sonntag 22. Dezember 2013, 10:28
von Sirius3
@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.

Re: Konvertieren von proc. in py. Datei

Verfasst: Sonntag 22. Dezember 2013, 11:37
von Kerl90210
Jetzt funzt es,
Vielen Dank!

Re: Konvertieren von proc. in py. Datei

Verfasst: Sonntag 22. Dezember 2013, 13:14
von Sirius3
@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()

Re: Konvertieren von proc. in py. Datei

Verfasst: Sonntag 22. Dezember 2013, 13:48
von Kerl90210
@ 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()