Hilfe mit json/pickle in python 3+

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.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

Hallo erstmal :)

Ich wollte die Forumsregeln lesen aber der link der in dem Thread "Vor dem posten lesen" http://wiki.python-forum.de/Forum/Regeln ist tot ^^

Nun zu meinem Problem :

Ich habe einen kleinen Stundenplan als Fingerübung geschrieben und versuche nun die Daten die der Nutzer eingegeben hat auch speichern und habe versucht das jeweils mit pickle oder json zu realisieren bin aber kläglich gescheitert ( siehe Code ^^) . Ich bin nun auf dr Suche nach einem Realisierungsansatz dafür weil ich das Ganze auch nicht so wirklich in Wege geleitet bekomme ... ich scheiterte zuletzt daran das schon (unschön) gespeicherte File ( zuletzt mit json) wieder schön einzulesen ... Mir ist bewusst dass ich die Struktur der Konstruktoren danach verändern muss , ich plane beim Initialisieren prüfen zu lassen ob Datei x (in Code data.txt) vorhanden ist und lesbar ist wenn nicht eine solche anlegen mit dem Output den anzeigen() der Klasse Woche() ausgibt . Krieg das aber nicht hin .

Natürlich freue ich mich auch über jede Kritik an meinem "stil" wenn man ihn als solchen bezeichnen kann da ich noch relativ am Anfang stehe was Programmieren betrifft . Bitte seit nachsichtig :)

(Auch toll , aber nebensächlich wäre eine "schönere" Ausgabe der Daten .. z.B. in einer Tabelle oder so aber trotzdem noch in der Shell wenn das möglich ist da ich mich an GUI's noch nicht rantraue )


Hier mein Code auf PB: http://pastebin.com/J0wcUhg7 [Für die die das Highlighting dort mehr mögen)

und einmal hier :

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import sys
import json
import pprint
import time
class stunde:

    def __init__(self):

        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}

    def aendern(self,was,information):
        
        if was in self.daten:
           self.daten[was] = information
        else:
           print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):
        
        return self.daten
    
    def load(self,data):

        self.daten=data
        print("Ihre persönlichen Daten wurden geladen ")

    def raum(self):
        
        print("Raum : ",self.daten['Raum'])
        

class tag:

    def __init__(self):
        
        self.stunden = []
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            
    def aendern(self,tagwas,was,information):

        if len(self.stunden)>=(tagwas-1):
            self.stunden[tagwas-1].aendern(was,information)
        else:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")
        
    def anzeigen(self):
        
        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):
        
        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def raum(self):
        
        for i in range(len(self.stunden)):
            print(i+1),self.stunden[i].raum()

class woche:

    def __init__(self):
        
        self.tage = []
        for i in range(5):
            day = tag()
            self.tage.append(day)

    def aendern(self,wochewas,tagwas,was,information):
        
        if len(self.tage)>=(wochewas-1):
            self.tage[wochewas-1].aendern(tagwas,was,information)
        else:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")
        
    def anzeigen(self , ouf = sys.stderr):
        
        for i in range(len(self.tage)):
            print("Tag ", i+1 ,  file = ouf),self.tage[i].anzeigen()

    def save(self):
        
        data =[]
        for i in range(len(self.tage)):
            it=self.tage[i].save()
            data.append(it)
        file = open("data.txt","w")
        data2save=str(data)
        file.write(json.dumps(data2save))

    def raum(self , ouf = sys.stderr):
        
        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()
 
def main():
    week=woche()
    eingabe = ""
    while 1:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan anzeigen")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ')
        print()
        if eingabe in ['t','T']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a','A']:
            week.anzeigen()
        elif eingabe in ['r','R']:
            week.raum()
        elif eingabe in["e","E"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                sys.exit(0)
        elif eingabe in ['l','L']:
            file = open("data.txt","r")
            week=json.load(file)
            file.close
            pprint.pprint(week)
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")

main()
 

Zuletzt geändert von astrionn am Montag 12. Januar 2015, 23:23, insgesamt 1-mal geändert.
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: ein Fehler liegt in Zeile 105: Du wandelst Deine Daten erst in einen String um, um ihn dann nach json zu transformieren. Und warum versuchst Du diese Datei mit pickle zu laden?
Deine Leerzeilen sind sehr ungünstig verteilt, weil sie den Lesefluß, statt zu leiten, zerreißen.
Warum speicherst Du die Daten Deiner Klasse in einem Dictionary und nicht, wie sinnvoll, in Attributen?
«for i in range(len(self.liste))» ist ein anti-pattern. In Python würde man direkt über die Liste iterieren.
Weißt Du was Du in Zeile 63 tust? Warum erzeugst Du ein Tuple wenn Du es gleich wieder wegwirfst?
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

Sirius3 hat geschrieben:@astrionn: ein Fehler liegt in Zeile 105: Du wandelst Deine Daten erst in einen String um, um ihn dann nach json zu transformieren. Und warum versuchst Du diese Datei mit pickle zu laden?
Deine Leerzeilen sind sehr ungünstig verteilt, weil sie den Lesefluß, statt zu leiten, zerreißen.
Warum speicherst Du die Daten Deiner Klasse in einem Dictionary und nicht, wie sinnvoll, in Attributen?
«for i in range(len(self.liste))» ist ein anti-pattern. In Python würde man direkt über die Liste iterieren.
Weißt Du was Du in Zeile 63 tust? Warum erzeugst Du ein Tuple wenn Du es gleich wieder wegwirfst?
welche leerzeichen meinst du denn z.b. ?
das rumgekorkse mit json und pickle waren wie gesagt nur versuche , welches von beidem empfiehlst du denn ?
du meinst ich sollte ohne str() dass machen und dann direkt transformieren ?
meinst du dass das dictionarie als speicherquelle in stunde() generell ungünstig gewählt ist ?
anstatt von for i in range(len(self.liste)) lieber for i in self.liste ?
was in zeile 63 ist das tupel ? das print(i+1) ?
und wo sollte ich diese Prüfgeschichte machen ? in woche() oder in main()?
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: ich mein Leerzeilen! Innerhalb von Funktionen braucht man z.B. so gut wie nie welche. «a,b» ist ein Tuple. Am besten vor «for tag in self.liste» bzw. «for stunde in self.list».
BlackJack

@astrionn: Leer*zeilen*. Und schau mal in den Style Guide for Python Code. Dann brauchst Du auch nicht Englisch und Deutsch mischen um Klassen und Exemplare auseinanderzuhalten wie bei `week` und `woche`.

Ich würde JSON empfehlen weil das nicht nur von Python geschrieben und gelesen werden kann und weil man die Datenstruktur beim (de)serialisieren explizit erstellen und die Werte herausnehmen muss. Pickle ist nicht wirklich geeignet um Daten von einem Programm das sich in der Entwicklung befindet längerfristig zu speichern, weil die Dateien von den Klassen und der Klassen- und Modulstruktur abhängen. Wenn die sich ändern kann man die Daten eventuell nicht wieder einlesen.

Bei der ``for``-Schleife `i` in echtem Code am besten nur für ganze Zahlen verwenden. Und `liste` ist ein schlechter Name für die Attribute. Ein Name sollte nicht den konkreten und sehr allgemeinen Typen benennen sondern dem Leser verraten was der Wert hinter dem Namen/Attribut bedeutet.

In Zeile 63 erstellst Du ein Tupel aus dem Rückgabewert von `print()` als erstem Wert und dem Rückgabewert von ``self.liste.anzeigen()`` als zweitem Wert und dann machst Du nichts mit dem Tupel. Das enthält ja auch keine sinnvollen Werte. Die zwei Ausdrücke gehören in jeweils eine eigene Zeile.

Du verwendest die Namen `load()` und `save()` sehr ungewöhnlich. Da erwartet man normalerweise das man einen Dateinamen übergeben kann und die Daten, nun ja tatsächlich geladen oder gespeichert werden.

Man sollte Programmlogik und Benutzerinteraktion trennen. In die ganzen Klassen die den Stundenplan modellieren gehören keine `print()`-Aufrufe. Sonst kann man das gar nicht wiederverwenden.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

also da ich bei load und save noch am arbeiten bin sind diese "fehler" unumgänglich .. ich möchte ja am ende auch dass dort gespeicher / geladen wird beim laden weiß ich auch noch nicht ob ob dort das laden der datei sein soll oder das wieder einfügen der daten in die listen/dicts. Ich habe meinen Code erstmal von pickeln und überflüssigen leerzeilen befreit und zeile 63 überarbeitet und im HT geupdatet .. weitere verbesserungsvörschläge und ideen wie ich die gespeicherten daten wieder einlese ?
So hab jetzt selbst versucht was zu machen bin jetzt glaube ich auf eine einzige Frage gekommen und zwar wie kann ich mit JSON die zu speichernden Daten als eine Liste von 5 Listen mit jeweils 11 Dict's speichern lassen ? Und bitte sagen ob dass im Quelltext unten jetzt so Sinn macht , kann den HT nicht mehr ändern deswegen hier der code und ohne pb-link :

Code: Alles auswählen

    # -*- coding: UTF8 -*-
    #!/usr/bin/env python3
    import sys
    import json
    import pprint
    import time
    class stunde:

        def __init__(self):

            self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}

        def aendern(self,was,information):
            
            if was in self.daten:
               self.daten[was] = information
            else:
               print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

        def anzeigen(self):

            print ("       ",self.daten )

        def save (self):
            
            return self.daten
        
        def load(self,data):
            
            self.data=data
            
            
        def raum(self):
            
            print("Raum : ",self.daten['Raum'])
            

    class tag:

        def __init__(self):
            
            self.stunden = []
            for i in range(11):
                std = stunde()
                self.stunden.append(std)
                
        def aendern(self,tagwas,was,information):

            if len(self.stunden)>=(tagwas-1):
                self.stunden[tagwas-1].aendern(was,information)
            else:
                print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")
            
        def anzeigen(self):
            
            for i in range(len(self.stunden)):
                print(i+1)
                self.stunden[i].anzeigen()

        def save (self):
            
            datas=[]
            for i in range(len(self.stunden)):
                datas.append(self.stunden[i].save())
            return datas

        def load(self,data):

            #hier muss 1 liste mit 11 dicts übergeben werden wenn :
            for i in range(len(self.stunden)):
                self.stunden[i].load(data[i])
            

        def raum(self):
            
            for i in range(len(self.stunden)):
                print(i+1),self.stunden[i].raum()

    class woche:

        def __init__(self):
            
            self.tage = []
            for i in range(5):
                day = tag()
                self.tage.append(day)

        def aendern(self,wochewas,tagwas,was,information):
            
            if len(self.tage)>=(wochewas-1):
                self.tage[wochewas-1].aendern(tagwas,was,information)
            else:
                print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")
            
        def anzeigen(self , ouf = sys.stderr):
            
            for i in range(len(self.tage)):
                print("Tag ", i+1 ,  file = ouf),self.tage[i].anzeigen()

        def save(self):
            
            data =[]
            for i in range(len(self.tage)):
                it=self.tage[i].save()
                data.append(it)
            file = open("data.txt","w")
            data2save=data
            file.write(json.dumps(data2save))

        def load(self,data):

            #data muss eine liste von 5 listen sein die jeweils 11 dicts enthalten ?
            for i in range(len(self.tage)):
                self.tage[i].load(data[i])#???
            

        def raum(self , ouf = sys.stderr):
            
            for i in range(len(self.tage)):
                print("Tag ", i+1 , file = ouf ),self.tage[i].raum()
     
    def main():
        week=woche()
        eingabe = ""
        while 1:
            print()
            print(" Eintragungen zu einem (T)ag ändern? ")
            print(" Wochenplanplan (a)nzeigen? ")
            print(" (R)aumplan anzeigen")
            print(" (E)nde? ")
            print()
            eingabe = input(' Ihre Wahl? ')
            print()
            if eingabe in ['t','T']:
                while True:
                    wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                    try:
                        wochewas = int(wochewas)
                        break
                    except ValueError :
                        print("Nur Zahlen eingeben bitte")
                while True :
                    tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                    try:
                        tagwas = int(tagwas)
                        break
                    except ValueError :
                        print("Nur Zahlen eingeben bitte")
                stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
                inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
                week.aendern(wochewas,tagwas,stdwas,inf)
            elif eingabe in ['a','A']:
                week.anzeigen()
            elif eingabe in ['r','R']:
                week.raum()
            elif eingabe in["e","E"]:
                    warten=input('Bitte nochmal Enter drücken! ')
                    week.save()
                    time.sleep(1)
                    sys.exit(0)
            elif eingabe in ['l','L']:
                file = open("data.txt","r")
                weekdata=json.load(file)
                file.close
                #pprint.pprint(weekdata)
                week.load(weekdata)
            else :
                print("Bitte ein Buchstaben aus den Klammern oben wählen!")

    main()
     

Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

also hab mich jetzt noch ein wneig weiter reingekniet komm aber immernoch nicht an meinem problem vorbei ... hab ein wenig rumgedoktort
und würde mich über verbesserungsvorschläge freuen :) und hilfe bei dem problem dass auftritt wenn man speichert dann schließt dann neu auführt und dann (nach dem automatischen laden) anzeigen anwählt...

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle
class stunde:

    def __init__(self):

        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}

    def aendern(self,was,information):

        if was in self.daten:
           self.daten[was] = information
        else:
           print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):

        return self.daten

    def load(self,data):

        self.data=data


    def raum(self):

        print("Raum : ",self.daten['Raum'])


class tag:

    def __init__(self):

        self.stunden = []
        self.start()

    def start(self):
        for i in range(11):
            std = stunde()
            self.stunden.append(std)

    def aendern(self,tagwas,was,information):

        if len(self.stunden)>=(tagwas-1):
            self.stunden[tagwas-1].aendern(was,information)
        else:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):

        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def load(self,data):

        #hier muss 1 liste mit 11 dicts übergeben werden wenn :
        for i in range(len(self.stunden)):
            self.stunden[i].load(data[i])


    def raum(self):

        for i in range(len(self.stunden)):
            print(i+1),self.stunden[i].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.start()

    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        dateiposition="\datas\data"
        checkpfad="".join((laufpfad,dateiposition))
        if os.path.exists(checkpfad)==True:
            with open(checkpfad,"rb") as filename:
                data=filename
            self.load(filename)
            print("Daten erfolgreich geladen")
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
            print("Keine Daten gefunden")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        if len(self.tage)>=(wochewas-1):
            self.tage[wochewas-1].aendern(tagwas,was,information)
        else:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")

    def anzeigen(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            if i == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if i == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if i == 2 :
                print("Mittwochtag ",file = ouf),self.tage[2].anzeigen()
            if i == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if i == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            else:
                print("Unbekkanter Tag Nr.",i+1,file=ouf),self.tage[i].anzeigen()

    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows':
                print("Windows detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if os.path.exists(neuerordner)== False:
                    os.mkdir(neuerordner)
                else:
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")
                    
        elif aktuell=='Linux':
                print("Linux detected as OS")

        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):

        #data muss eine liste von 5 listen sein die jeweils 11 dicts enthalten ?
        for i in range(len(self.tage)):
            self.tage[i].load(data[i])#???


    def raum(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()

def main():
    week=woche()
    eingabe = ""
    while 1:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ')
        print()
        if eingabe in ['t','T']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a','A']:
            week.anzeigen()
        elif eingabe in ['r','R']:
            week.raum()
        elif eingabe in ['b','B']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f','F']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e","E"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Bye Bye")
                #sys.exit()
                os._exit(0)
        elif eingabe in ['s','S']:
            
            week.save()
            
        elif eingabe in ['l','L']:
            pfad=os.path.dirname(sys.argv[0])
            datas="\datas"
            data="\data"
            echterpfad="".join((pfad,datas,data))
            with open(echterpfad,"rb") as file:
                weekdata=pickle.load(file)
            file.close
            #pprint.pprint(weekdata)
            week.load(weekdata)
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
BlackJack

@astrionn: Setz doch erst einmal die Verbesserungsvorschläge um. PEP8, Trennung von Programmlogik und Benutzerinteraktion, das komische Tupel ist auch immer noch da…
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

oh wieder eigentlich :/ hab ausversehen an der falschen datei weitergearbeitet haha alles wo print/input vorkommt gilt als interaktion und gehört in main ?
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

Sooo ich mal wieder mit viel Geduld und google hab ich es geschafft mein problem zu lösen für jeden der das gleiche problem hat oder dens interessiert hier der code :

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle
class stunde:

    def __init__(self):

        self.daten = {}

    def start(self):

        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}


    def aendern(self,was,information):

        if was in self.daten:
           self.daten[was] = information
        else:
           print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):

        return self.daten

    def load(self,data):
        self.daten={}
        self.daten=data


    def raum(self):

        print("Raum : ",self.daten['Raum'])


class tag:

    def __init__(self):

        self.stunden = []
        

    def start(self):
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden.start()

    def aendern(self,tagwas,was,information):

        if len(self.stunden)>=(tagwas-1):
            self.stunden[tagwas-1].aendern(was,information)
        else:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):

        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def load(self,data):

        #hier muss 1 liste mit 11 dicts übergeben werden wenn :
        for x in data:
            t = stunde();
            t.load(x);
            self.stunden.append(t)

    def raum(self):

        for i in range(len(self.stunden)):
            print(i+1),self.stunden[i].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.start()

    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        dateiposition="\datas\data"
        checkpfad="".join((laufpfad,dateiposition))
        if os.path.exists(checkpfad)==True:
            with open(checkpfad,"rb") as filename:
                data=pickle.load(filename)
            self.load(data)
            print("Daten erfolgreich geladen")
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage.start()
            print("Keine Daten gefunden")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        if len(self.tage)>=(wochewas-1):
            self.tage[wochewas-1].aendern(tagwas,was,information)
        else:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")

    def anzeigen(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            if i == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if i == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if i == 2 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if i == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if i == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            

    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows':
                print("Windows detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if os.path.exists(neuerordner)== False:
                    os.mkdir(neuerordner)
                else:
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")
                    
        elif aktuell=='Linux':
                print("Linux detected as OS")

        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):
        pprint.pprint(data)
        print("#################################")
#hier liegt ein FEHLER die daten werden fehlerhaft eingelesen oder garnicht
        for x in data:
            t = tag();
            t.load(x);
            self.tage.append(t)


    def raum(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()

def main():
    week=woche()
    eingabe = ""
    while 1:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ')
        print()
        if eingabe in ['t','T']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a','A']:
            week.anzeigen()
        elif eingabe in ['r','R']:
            week.raum()
        elif eingabe in ['b','B']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f','F']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e","E"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Bye Bye")
                #sys.exit()
                os._exit(0)
        elif eingabe in ['s','S']:
            
            week.save()
            
        elif eingabe in ['l','L']:
            pfad=os.path.dirname(sys.argv[0])
            datas=r"\datas"
            data=r"\data"
            echterpfad="".join((pfad,datas,data))
            with open(echterpfad,"rb") as file:
                weekdata=pickle.load(file)
            #pprint.pprint(weekdata)
            week.load(weekdata)
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: Du hast immer noch überall for-range-len-Konstrukte drin. Eine for-Schleife, die jeden einzelnen Schleifendurchgang durch ein if wieder auftrennt, ist die interessanteste for-Schleifenkonstruktion die ich je gesehen habe. Und dass ein einfaches Save betriebssystemabhängig ist, wäre mir auch neu; wo ist denn da was Windows-spezifisches drin? Wenn Du das gelöst hast, und alles aus meinem ersten Post berücksichtigt hast, können wir ja über die ganzen anderen Unschönheiten reden, weil so wie er jetzt ist, möchte ich mir den Code nicht näher ansehen müssen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sirius3 hat geschrieben:Eine for-Schleife, die jeden einzelnen Schleifendurchgang durch ein if wieder auftrennt, ist die interessanteste for-Schleifenkonstruktion die ich je gesehen habe.
Vielleicht ist das die if-Schleife, von der so man so häufig liest?
In specifications, Murphy's Law supersedes Ohm's.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@sirius3 ja okay ich mach mich ran diese "if-schleifen" aufzulösen .. ich war mir nicht sicher und hab grad kein linux bei der hand um es zu testen deswegen hab ich mir gedacht ich bin lieber vorsichtig und geh auf nummer sicher ... es ging z.b. um "/" oder "\" wo windows ja manchmal eigen ist hätt ja sein können wenn jemand der linux nutzt mir sagt dass es so funktioniert dann kann ich dass auch guten herzens als allgemein machen

also irgendwie verstehe ich die welt nicht mehr .. vorhin hat er funktioniert aber jetzt macht ers mit dem laden nicht mehr mit weil die dateipfade nicht hinhauen .. er machte entweder aus C:/ordner --> C://ordner oder macht dass was ich dazu packen will "falsch" also C:/ordner/ordner1 wird wenn ich ordner1 hzfg zu C:/ordner\ordner eins oder sowas :( hülfe

am code muss in start() von woche und tag jeweils in der for schleife zu self.tage.start() bzw self.stunden,start() verändert werden
Zuletzt geändert von astrionn am Mittwoch 14. Januar 2015, 22:44, insgesamt 1-mal geändert.
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
BlackJack

@astrionn: Wo ist denn dort etwas mit '\' vs. '/' in der `save()`-Methode? Genau wegen solcher Unterschiede gibt es ja die Funktionen im `os.path()`-Modul die Du da verwendest. Was nicht plattformübergreifend geht ist Pfadtrenner hart in Zeichenketten zu schreiben wie bei ``"\datas\data"``, da solltest Du auch mit `os.path.join()` arbeiten.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@BlackJack oh okay ich probiers weil nach schließen und wiederöffnen hats wieder funktioniert ... keine ahnung wieso aber ich benutze mal dein vorschalg mit os.path.join()

so richtig(er)?

Code: Alles auswählen

            pfad=os.path.dirname(sys.argv[0])
            print(pfad)
            echterpfad=os.path.join(pfad,"datas","data")
@sirus3 in zeile 69 kann ich for i in self.stunden nicht machen ... dass gleiche in zeile 76 und 90 ich denke das zieht sich auch weiter durch den code welche alternative gibt es denn an dieser stelle ?
so neuer code mit ein paar zusätzen :

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle
class stunde:

    def __init__(self):

        self.daten = {}

    def start(self):

        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}


    def aendern(self,was,information):

        if was in self.daten:
           self.daten[was] = information
        else:
           print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):

        return self.daten

    def load(self,data):
        self.daten={}
        self.daten=data


    def raum(self):

        print("Raum : ",self.daten['Raum'])


class tag:

    def __init__(self):

        self.stunden = []
        

    def start(self):
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden[i].start()

    def aendern(self,tagwas,was,information):

        if len(self.stunden)>=(tagwas-1):
            self.stunden[tagwas-1].aendern(was,information)
        else:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):

        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def load(self,data):

        #hier muss 1 liste mit 11 dicts übergeben werden wenn :
        for x in data:
            t = stunde();
            t.load(x);
            self.stunden.append(t)

    def raum(self):

        for i in range(len(self.stunden)):
            print(i+1),self.stunden[i].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.start()

    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        dateiposition="\datas\data"
        checkpfad="".join((laufpfad,dateiposition))
        if os.path.exists(checkpfad)==True:
            with open(checkpfad,"rb") as filename:
                data=pickle.load(filename)
            self.load(data)
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage[i].start()
            print("Keine Daten gefunden")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        if len(self.tage)>=(wochewas-1):
            self.tage[wochewas-1].aendern(tagwas,was,information)
        else:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")

    def anzeigen(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            if i == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if i == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if i == 2 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if i == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if i == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            

    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows':
                print("Windows detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if os.path.exists(neuerordner)== False:
                    os.mkdir(neuerordner)
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")
                elif os.path.exists(neuerordner)== True:
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")
                else:
                    pprint.pprint("Keine Daten gefunden. Dieser Fehler sollte nicht auftreten!")
                    
        elif aktuell=='Linux':
                print("Linux detected as OS")

        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):
        #pprint.pprint(data)
        #print("#################################")
        for i in data:
            t = tag();
            t.load(i);
            self.tage.append(t)
        print("Daten geladen")

    def raum(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()

def main():
    week=woche()
    eingabe = ""
    while 1:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ')
        print()
        if eingabe in ['t','T']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a','A']:
            week.anzeigen()
        elif eingabe in ['r','R']:
            week.raum()
        elif eingabe in ['b','B']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f','F']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e","E"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Bye Bye")
                #sys.exit()
                os._exit(0)
        elif eingabe in ['s','S']:
            
            week.save()
            
        elif eingabe in ['l','L']:
            pfad=os.path.dirname(sys.argv[0])
            echterpfad=os.path.join(pfad,"datas","data")
            try:
                with open(echterpfad,"rb") as file:
                    weekdata=pickle.load(file)
                    week.load(weekdata)
            except FileNotFoundError:
                print("Keine Daten gefunden") 
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
main()
Zuletzt geändert von astrionn am Mittwoch 14. Januar 2015, 23:08, insgesamt 1-mal geändert.
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: für die Unterschiede in den Dateisystemen gibt es ja extra das os.path-Modul.
Zeile 18: Werte sollte man nicht mit Leerzeichen initialisieren, sondern z.B. mit leeren Strings oder None, das das fehlen eines Wertes anzeigt.
Zeile 26: Wenn etwas schief läuft, meldet man das der aufrufenden Funktion mit hilfe von Exceptions, so kann die dann entscheiden, wie sie mit dem Fehler umgeht. Damit lassen sich Klassen auch in anderen Zusammenhängen wiederverwenden. Hättest Du Attribute statt eines Dicts genommen, könntest Du dann statt einer eigenen Methode die Funktion setattr verwenden.
Zeile 37: überflüssig, da Du daten in der nächsten Zeile überschreibst.
Zeile 57: Eine Liste hat keine Methode start.
Zeile 64: siehe Zeile 26. Dann braucht man das if nicht, weil ein falscher tagwas einen IndexError auslöst.
Zeile 68,75, 89: anti-pattern, siehe ersten Post. schau dir auch enumerate an.
Zeile 83, 84: ; überlüssig und schlechter Stil. Variablennamen schlecht, die sagen einem nichts.
Zeile 90: unnötiges Tuple, siehe ersten Post
Zeile 102: \ ist Escapezeichen in Strings
Zeile 103: Verzeichnisse setzt man mit os.path.join zusammen (bei zwei Strings würde man auch + verwenden)
Zeile 104: Auf True testet man nicht explizit, "==True" weglassen
Zeile 105: filename ist ein falscher Name, das ist kein Dateiname!
Zeile 113: siehe Zeile 57
Zeile 123: siehe Zeile 64
Zeile 127-137: siehe vorherigen Post, Lösung: Liste mit Wochenamen und zip.
Zeile 146: Auf False testet man nicht explizit, nimm not. Warum wird nichts gespeichert, wenn das Verzeichnis erst erzeugt werden muß?
Zeile 150: siehe Zeile 68
Zeile 154: siehe Zeile 105
Zeile 155: unnötig, Variablen umzubenennen.
Zeile 157: close zwar unnötig wegen with, aber wenn dann sollte Funktion auch aufgerufen werden.
Zeile 172: siehe 83
Zeile 180: siehe 68
Zeile 186: while True
Zeile 197,215, ...: mit eingabe.lower() einfachere ifs
Zeile 243: _exit ist nicht öffentlich, besser return
Zeile 183-258: main viel zu lang
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@sirius3 erstmal danke für die hilfe und die art der hilfe ! gefällt mir sehr ! ich habe die meisten vorschläge umgesetzt nur ein paar problemchen hatte ich dabei ...

Ich habe übrigens dort ein Dictionary benutzt weil ich den Umgang mit diesen üben wollte und dachte es wäre praktisch was es bis jetzt auch zu sein scheint.

zu
Zeile 68,75, 89: anti-pattern, siehe ersten Post. schau dir auch enumerate an.
diese anti patterns kriege ich nicht aufgelöst, meins funktioniert ist aber nicht schön richtig ? ich weiß nur nicht wie ich dass schön anstellen soll... hab mir auch enumerate angeschaut und verstehe wie es funktioniert aber nicht ob/wie sich dass bei mir dort anwenden lässt

zu
Zeile 127-137: siehe vorherigen Post, Lösung: Liste mit Wochenamen und zip.
weiß auch nicht wie das geht ich nehme an das hat auch mit dem oberen problem zutun

zu
Zeile 243: _exit ist nicht öffentlich, besser return
ich weiß nicht genau was du damit meinst bei mir sind die zeilen nciht mehr so genau weil ich schon viel verändert habe aber ich nehme an du meinst os._exit , ich habe dies und nicht sys.exit benutzt weil sys anscheinend nicht auf linux funktioniert und auch nicht verstehe was es bedeutet mit "ist nicht öffentlich" bzw was das für ein problem sein könnte ( zu deiner änderung soll ich statt os._exit() also os.return oder return schreiben ? )

zu
Zeile 183-258: main viel zu lang
okay mag sein aber wie soll ich das kürzen ? bzw das mit der hier gewollten trennung zwischen progammlogik und userinteraktion vereinen ?

danke nochmal für die hilfe und wie sie gestellt ist :)

hier mein code samt deiner verbesserungsvorschläge:

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle
class stunde:

    def __init__(self):

        self.daten = {}

    def start(self):

        self.daten = {'Fach': "", 'Raum': "", 'Lehrer': ""}


    def aendern(self,was,information):

        try:
            self.daten[was]=information
        except:
            print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):

        print ("       ",self.daten )

    def save (self):

        return self.daten

    def load(self,data):
        self.daten=data


    def raum(self):

        print("Raum : ",self.daten['Raum'])


class tag:

    def __init__(self):

        self.stunden = []
        

    def start(self):
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden[i].start()

    def aendern(self,tagwas,was,information):

        try :
            self.stunden[tagwas-1].aendern(was,information)
        except:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].anzeigen()

    def save (self):

        datas=[]
        for i in range(len(self.stunden)):
            datas.append(self.stunden[i].save())
        return datas

    def load(self,data):

        #hier muss 1 liste mit 11 dicts übergeben werden wenn :
        for i in data:
            std = stunde();
            std.load(i);
            self.stunden.append(std)

    def raum(self):

        for i in range(len(self.stunden)):
            print(i+1)
            self.stunden[i].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.start()

    def start(self):

        laufpfad=os.path.dirname(sys.argv[0])
        laufpfad=os.path.join(laufpfad,"datas","data")
        if os.path.exists(laufpfad):
            with open(laufpfad,"rb") as ladedatei:
                data=pickle.load(ladedatei)
            self.load(data)
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage[i].start()
            print("Keine Daten gefunden")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        try:
            self.tage[wochewas-1].aendern(tagwas,was,information)
        except:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")


    def anzeigen(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            if i == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if i == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if i == 2 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if i == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if i == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
            

    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows':
                print("Windows detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if not os.path.exists(neuerordner):
                    os.mkdir(neuerordner)
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    print("Daten erfolgreich gespeichert")
                elif os.path.exists(neuerordner):
                    data =[]
                    for i in range(len(self.tage)):
                        it=self.tage[i].save()
                        data.append(it)
                    neuerpfad=os.path.join(neuerordner,"data")
                    with open(neuerpfad,"wb") as filename:
                        data2save=data
                        pickle.dump(data2save,filename)
                    filename.close
                    print("Daten erfolgreich gespeichert")
                else:
                    pprint.pprint("Keine Daten gefunden. Dieser Fehler sollte nicht auftreten!")
                    
        elif aktuell=='Linux':
                print("Linux detected as OS")

        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):
        #pprint.pprint(data)
        #print("#################################")
        for i in data:
            day = tag();
            day.load(i);
            self.tage.append(day)
        print("Daten geladen")

    def raum(self , ouf = sys.stderr):

        for i in range(len(self.tage)):
            print("Tag ", i+1 , file = ouf ),self.tage[i].raum()

def main():
    week=woche()
    eingabe = ""
    while True:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ').lower()
        print()
        if eingabe in ['t']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a']:
            week.anzeigen()
        elif eingabe in ['r']:
            week.raum()
        elif eingabe in ['b']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Bye Bye")
                #sys.exit()
                os._exit(0)
        elif eingabe in ['s']:
            
            week.save()
            
        elif eingabe in ['l']:
            pfad=os.path.dirname(sys.argv[0])
            echterpfad=os.path.join(pfad,"datas","data")
            try:
                with open(echterpfad,"rb") as file:
                    weekdata=pickle.load(file)
                    week.load(weekdata)
            except FileNotFoundError:
                print("Keine Daten gefunden") 
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
BlackJack

@astrionn: Nicht-öffentlich heisst das die Funktion dazu vorgesehen ist von jemandem von aussen benutzt zu werden. Das wird durch den führenden Unterstrich angezeigt. Damit werden per Konvention Namen gekennzeichnet die Implementierungsdetails sind und damit nicht zur öffentlichen API gehören.

Und natürlich gibt es das `sys`-Modul auch unter Linux.

`os.return` kannst Du zwar schreiben, aber das ist ein Syntaxfehler. ``return`` ist ein Schlüsselwort und kann deshalb nicht als Name verwendet werden.

Mit ``in`` zu testen ob etwas in einer Liste mit einem einzigen Element enthalten ist ist ziemlich umständlich dafür das man eigentlich nur zwei Werte miteinander vergleicht.

Das `load()` und `save()` die falschen Namen für etwas sind was nicht aus einer Datei lädt oder speichert hatte ich glaube ich schon mal erwähnt. Genau wie den Style Guide for Python Code wegen der Namensschreibweisen. Über Leerzeilen- und -zeichensetzung steht dort auch etwas drin.

`pickle` wird hier nicht sinnvoll eingesetzt. Die Stärke von dem Modul ist ja gerade das man damit (nahezu) beliebige Strukturen aus Objekten direkt speichern und laden kann. Was gleichzeitig eine Schwäche ist weil die Daten a) damit von Python abhängig sind und b) nicht mehr geladen werden können wenn sich an den Objekten und der Codestruktur etwas ändert was das laden verhindert. Wenn Du sowieso nur Grunddatentypen speicherst die auf JSON abgebildet werden können, macht es keinen Sinn `pickle` stattdessen zu verwenden.

Die Hauptfunktion sollte man jetzt noch durch folgendes Idiom starten:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Dann kann man das Modul auch importieren, ohne das die Funktion ausgeführt wird.

Die Länge der Hauptfunktion bekommt man in den Griff in dem man sie auf mehrere Funktionen aufteilt. Eine Funktion pro Menüpunkt wäre zum Beispiel eine Möglichkeit das etwas übersichtlicher zu machen. Dann braucht man auch nicht so viele ``if``-Abfragen sondern kann ein Wörterbuch anlegen das Menübuchstaben auf Funktionen abbildet.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@astrionn: hier ein Beispiel:

Code: Alles auswählen

    def anzeigen(self):
        for idx, stunde in enumerate(self.stunden, 1):
            print(idx)
            stunde.anzeigen()
Bei Save ab Zeile 139: der else-Zweig wird nie aufgerufen, weil das elif schon die Negation des if ist. Wenn etwas in beiden if-Zweigen gleich ist, kann man es auch einmal danach ausführen. Meine restlichen Anmerkungen zu diesen Zeilen hast Du noch nicht beachtet.
astrionn
User
Beiträge: 43
Registriert: Freitag 28. Februar 2014, 19:20

@sirius3 ich habe versucht soviel wie möglich umzusetzten.

momentan bin ich noch dabei die for i in range(len(self.xxx)) wegzubekommen und hab das auch schon öfter geschafft (glaub ich)
ich versage noch bei raum() in woche() also glaub ich weil ich zwar i bei for angebe es aber nicht benutze ... außerdem in anzeigen () oder ?

wie ich das machen soll mit anzeigen() dass er halt auch die wochentage mit gibt ohne if weiß ich nicht ich habe einen vorschlag in ein kommentar dort gepackt ...

ich hab noch ein paar mehr sachen gemacht z.b. start privat gemacht oder so , wie ich das os._exit ändern soll hab ich immernoch nicht verstanden und das mti den kommentaren vervollständige bzw überarbeite ich nochmal ... sollte sowas auf englisch sein ? ich mein das was man dann über help() aufrufen kann ?

Code: Alles auswählen

# -*- coding: UTF8 -*-
#!/usr/bin/env python3
import os
import platform
import sys
import json
import pprint
import time
import pickle

class stunde:
    """ Eine einzelne Stunde """

    def __init__(self):
        """Konstruktor : Erschafft eine stunde mit einem leeren Wörterbuch"""
        self.daten = {}

    def __start__(self):
        """Private Methode: Weißt self.daten Standardwerte zu"""
        self.daten = {'Fach': "    ", 'Raum': "    ", 'Lehrer': "    "}


    def aendern(self,was,information):
        """Methode: Probiert den Wert "was" des Wörterbuchs zu "information" zu ändern """
        try:
            self.daten[was]=information
        except:
            print('Fehler bei der Eingabe bitte auch Groß/Kleinschreibeung beachten')

    def anzeigen(self):
        """Methode: Gibt self.daten aus"""
        print ("       ",self.daten )

    def save (self):
        """Methode: Gibt self.daten zum Speichern zurück"""
        return self.daten

    def load(self,data):
        """Methode: Setzt self.daten auf data welches als dict übergeben wird"""
        try:
            self.daten=data
        except:
            print("Fehler beim Laden")

    def raum(self):
        """Methode: Gibt den Wert des Schlüssels "Raum" aus"""
        print("Raum : ",self.daten['Raum'])


class tag:
    """Arbeitstag"""
    def __init__(self):
        """Konstruktor: Erschafft eine leere Liste"""
        self.stunden = []

    def __start__(self):
        """Private Methode: Fügt self.stunden 11 Stunden hinzu und ruft __start__() dieser auf"""
        for i in range(11):
            std = stunde()
            self.stunden.append(std)
            self.stunden[i].__start__()

    def aendern(self,tagwas,was,information):
        """Methode: Probiert die Methode "aendern" mit den parametern "was" und "informationen" des Objekts auf der liste self.stunden an der stelle tagwas-1 aufzurufen"""
        try :
            self.stunden[tagwas-1].aendern(was,information)
        except:
            print("Dieser tag hat nur " , len(self.stunden) , "Stunden. Bitte eine dieser wählen")

    def anzeigen(self):
        """Methode: Ruft die Methode anzeigen() jeden Objekts in der liste self.stunden auf"""
        for idx, stunde in enumerate(self.stunden, 1):
            print(idx)
            stunde.anzeigen()

    def save (self):
        """Methode: Erzeugt eine leere Liste und fügt dieser die return werte der methode save() welche für jedes objekt auf der liste self.stunden aufgerufen wird und gibt diese liste wieder"""
        datas=[]
        for idx, stunde in enumerate (self.stunden,0):
            datas.append(self.stunden[idx].save())
        return datas

    def load(self,data):
        """Methode: Erschafft für jedes Objekt in data eine stunde und ruft für diese die methode load mit dem parameter"""
        for i in data:
            std = stunde();
            std.load(i);
            self.stunden.append(std)

    def raum(self):

        for idx,i in enumerate(self.stunden):
            print(idx+1)
            self.stunden[idx].raum()

class woche:

    def __init__(self):

        self.tage = []
        self.__start__()

    def __start__(self):

        laufpfad=os.path.dirname(sys.argv[0])
        laufpfad=os.path.join(laufpfad,"datas","data")
        if os.path.exists(laufpfad):
            with open(laufpfad,"rb") as ladedatei:
                data=pickle.load(ladedatei)
            self.load(data)
        else:
            for i in range(5):
                day = tag()
                self.tage.append(day)
                self.tage[i].__start__()
            print("Willkommen bei der Erstbenutzung diesen Programms ! Viel Spaß!")
        
        

    def aendern(self,wochewas,tagwas,was,information):

        try:
            self.tage[wochewas-1].aendern(tagwas,was,information)
        except:
            print("Diese Woche hat nur " , len(self.tage) , "Tage zur Auswahl. Bitte einen dieser wählen")


    def anzeigen(self , ouf = sys.stderr):

        for idx,tag in enumerate(self.tage):

            if idx == 0 :
                print("Montag ",file = ouf),self.tage[0].anzeigen()
            if idx == 1 :
                print("Dienstag ",file = ouf),self.tage[1].anzeigen()
            if idx == 2 :
                print("Mittwoch ",file = ouf),self.tage[2].anzeigen()
            if idx == 3 :
                print("Donnerstag ",file = ouf),self.tage[3].anzeigen()
            if idx == 4 :
                print("Freitag ",file = ouf),self.tage[4].anzeigen()
           # print("Tag",idx,file=ouf),self.tage[idx].anzeigen()

    def save(self):
        aktuell = platform.system()
        if aktuell=='Windows' or aktuell=='Linux':
                print(str(aktuell)," detected as OS!")
                ordner=os.path.dirname(sys.argv[0])
                neuerordner=os.path.join(ordner,"datas")
                if not os.path.exists(neuerordner):
                    os.mkdir(neuerordner)
                    print("Unterverzeichnis angelegt")
                data =[]
                for idx,tag in enumerate(self.tage):
                    it=self.tage[idx].save()
                    data.append(it)
                neuerpfad=os.path.join(neuerordner,"data")
                with open(neuerpfad,"wb") as filename:
                    data2save=data
                    pickle.dump(data2save,filename)
                print("Daten erfolgreich gespeichert")
        else:
            print("Dein Betriebssystem ,",aktuell,"wird leider nicht unterstützt")

        

    def load(self,data):

        for i in data:
            day = tag();
            day.load(i);
            self.tage.append(day)
        print("Daten geladen")

    def raum(self , ouf = sys.stderr):

        for idx,i in enumerate(self.tage):
            print("Tag ", idx , file = ouf ),self.tage[idx].raum()

def main():
    week=woche()
    eingabe = ""
    while True:
        print()
        print(" Eintragungen zu einem (T)ag ändern? ")
        print(" Wochenplanplan (a)nzeigen? ")
        print(" (R)aumplan der Woche anzeigen")
        print(" Einen (b)estimmten Tag anzeigen?")
        print(" Den Raumplan (f)ür einen bestimmten Tag anzeigen?")
        print(" (E)nde? ")
        print()
        eingabe = input(' Ihre Wahl? ').lower()
        print()
        if eingabe in ['t']:
            while True:
                wochewas =(input('Welchen Tag wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    wochewas = int(wochewas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            while True :
                tagwas = (input('Welche Stunde wollen Sie bearbeiten? (Bitte Zahl angeben!) '))
                try:
                    tagwas = int(tagwas)
                    break
                except ValueError :
                    print("Nur Zahlen eingeben bitte")
            stdwas = input('Welche Information wollen Sie eintragen? (Fach, Raum oder Lehrer?) ').title()
            inf = input('Was soll eingetragen werden?(Maximal 4 Zeichen) ')[:4].ljust(4)
            week.aendern(wochewas,tagwas,stdwas,inf)
        elif eingabe in ['a']:
            week.anzeigen()
        elif eingabe in ['r']:
            week.raum()
        elif eingabe in ['b']:
            while True:
                was=input("Welchen Tag wollen sie anzeigen lassen ? (Nur Zahlen bitte !")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen eingeben bitte!")
            week.tage[was-1].anzeigen()
        elif eingabe in ['f']:
            while True:
                was=input("Von welchem Tag wollen sie den Raumplan anzeigen lassen ?(Nur Zahlen bittte!)")
                try:
                    was=int(was)
                    break
                except ValueError:
                    print("Nur Zahlen bitte!")
            week.tage[was-1].raum()
        elif eingabe in["e"]:
                warten=input('Bitte nochmal Enter drücken! ')
                week.save()
                time.sleep(1)
                print("Auf Wiedersehen!")
                os._exit(0)
        elif eingabe in ['s']:
            
            week.save()
            
        elif eingabe in ['l']:
            pfad=os.path.dirname(sys.argv[0])
            echterpfad=os.path.join(pfad,"datas","data")
            try:
                with open(echterpfad,"rb") as file:
                    weekdata=pickle.load(file)
                    week.load(weekdata)
            except FileNotFoundError:
                print("Keine Daten gefunden") 
        else :
            print("Bitte ein Buchstaben aus den Klammern oben wählen!")
        

print("Ihr Stundenplaner wurde geladen!")
if __name__ == '__main__':
    main()
Anfänger in den Kinderschuhen aber bestrebt besser zu werden ():O
Antworten