localtime variable in Pickle Dateinamen nutzen

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.
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Hallo liebe Pythoner,
Ich hab'n Problem unzwar,
ich will in einem pickle Dateinamen eine localtime variable benutzen, aber es kommt die Fehlermeldung(bei diesem Code)

Code: Alles auswählen

import easygui# importiert easygui ( Ein Modul)
import pickle
import time
def Notenberechnung():
    pass
x = time.localtime()
ntl_data = open("Notendurchschnitt für den"x ,'w')
easygui.msgbox(msg="Wenn z.b. niemand eine 1 oder eine 5 geschrieben hat, bitte 0 eingeben, sonst funktioniert's nicht!", title="Wichtiger Hinweis")
AS = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche die Arbeit geschrieben haben eingeben', title='Bitte Schüleranzahl eingeben')
AD1 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 1 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 1 eingeben')
AD2 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 2 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 2 eingeben')
AD3 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 3 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 3 eingeben')
AD4 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 4 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 4 eingeben')
AD5 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 5 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 5 eingeben')
AD6 = easygui.enterbox(msg='Bitte Anzahl der Schüler, welche eine 6 in der Arbeit geschrieben haben eingeben', title='Notenanzahl der 6 eingeben')
# holt die Werte durch easygui
AD1=int(AD1)#wandelt sie in ints um
AD2=int(AD2)
AD3=int(AD3)
AD4=int(AD4)
AD5=int(AD5)
AD6=int(AD6)
P6 = AD6 * 6 # rechnet anzahl der Schüler welche eine 6 geschrieben haben mal 6 wie bei 5,4,3,2,1
P5 = AD5 * 5
P4 = AD4 * 4
P3 = AD3 * 3
P2 = AD2 * 2
P1 = AD1 * 1
Y = int(P1) + int(P2) + int(P3) + int(P4) + int(P5) + int(P6) # rechnet die zuvor errechneten Werte zusammen
DS =  float(Y) / float(AS) # rechnet Y durch die Anzahl der Schüler welche die Arbeit geschrieben haben
ntl_data.write(DS)
ntl_data.close()
print(DS) # schreibt DS 

if __name__ == "__main__":
    Notenberechnung()
invalid Synthax.
Wie kann ich erreichen, das Python die localtime variable in dem Dateinamen akzeptiert?

Viele Grüße
Micky 2010

P.S. lasst euch so richtig an der Kritik zum Code und am Code aus.
Bitte schickt mir Verbesserungsvorschläge
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
deets

hattest du dasselbe Ding nicht schonmal gepostet? Die Kritik ist dieselbe:

- sinnlose int-konvertierungen
- durchnumerierte variablennamen - ein klares zeichen dafuer, das man eine geeignetere datenstruktur verwenden sollte
- dein __main__ und der Funktionsaufruf sind voellig effektlos

Ausserdem ist deine Fehlermeldung ein bisschen duerftig. Bitte den vollen Stacktrace, nicht nur das, was du glaubst, was wichtig ist.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Bei dem Code hackts an vielen Stellen.

Ich fang mal mit dem ersten an, der ist jetzt nicht so kritisch, aber sinnlos:

Code: Alles auswählen

import easygui# importiert easygui ( Ein Modul)
Warum schreibst du dazu, dass das ein Modul ist? Mit import importiert man immer Module.

Code: Alles auswählen

ntl_data = open("Notendurchschnitt für den"x ,'w')
Wenn du das x an den String hängen willst, dann macht man das definitiv nicht so! Schau mal in die Doku wie man zwei String konkateniert bzw. aneinander hängt. Wenn man mit Dateipfaden arbeitet benutzt man ja auch eigentlich os.path.join

Grüße,
anogayales
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Zwei Dinge helfen dir hier noch bei der Fehlermeldung: Du informierst dich, was "Syntax" ist und schaust dir dann noch einmal die Zeile an, die dir in der Fehlermeldung genannt wird.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mit localtime() hat das nichts zu tun.
Wenn du nicht selbst merkst, dass die Zeile

Code: Alles auswählen

ntl_data = open("Notendurchschnitt für den"x ,'w')
syntaktisch falsch ist (der Traceback zeigt dir sogar die Zeilenummer an), dann solltest du mit Python noch einmal ganz ganz vorne anfangen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

  • Du verwendest für die Eingabe jeder einzelnen Note die gleiche Anweisung mit lediglich leicht verändertem Text. Das schreit nach einer Schleife!
  • Den Hinweis, eine 0 einzugeben um keinen Fehler zu provozieren kannst Du Dir ebenfalls sparen, wenn Du die Eingabe validierst, bevor Du damit rechnest. Damit sollte man nicht den User, der ja bekanntlich dumm ist :wink: , konfrontieren.
  • Deine Namen sind nicht gut gewählt. Gute Namen, die selbsterklärend auf das hinweisen, was sich dahinter verbirgt, sind super wichtig für jeden Außenstehenden, der Deinen Code verstehen möchte. Und wenn Du selbst länger nicht mehr an Deinem Code gearbeitet hast, wirst Du dieser Außenstehende sein... :)
Ich könnte mir etwas in der Art vorstellen:

Code: Alles auswählen

def average():
    sum_ = 0
    students = int(raw_input('Anzahl der Schueler: '))
    for grade in xrange(1, 7):
        prompt = 'Arbeiten mit Note {0}: '.format(grade)
        try:
            sum_ += int(raw_input(prompt)) * grade
        except ValueError:
            pass
    return sum_ / students
  • Nach Eingabe der Schüleranzahl (die man auch noch überprüfen sollte!) beginnt die for-Schleife.
  • 'grade' erhält mit jedem Schleifendurchgang aus 'xrange()' die Zahlen 1 - 6.
  • Mit dieser Zahl wird dann der Eingabetext in 'prompt' gebildet.
  • Innerhalb 'try: ... except:' wird versucht, die Eingabe in eine Zahl umzuwandeln, mit 'grade' zu multiplizieren und zu 'sum_' zu addieren. Wenn das fehlschlägt, weil die Eingabe nicht in eine Zahl umgewandelt werden kann (ValueError), geschieht nichts.
  • 'return' gibt Dir dann den Notendurchschnitt zurück.
Um Eingaben zu validieren kannst Du Dir auch mal EyDu's Beispiel und den Thread dazu anschauen.
Was Du Dir auch einmal durchlesen solltest wäre der Abschnitt zu Schleifen im Python Tutorial und die Doku zu den built-in Funktionen. Lohnt sich sehr!

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Hi ich hab mir das auch mal vorgenommen:

Code: Alles auswählen

from tkinter import *
import time

class Notenberechnung(object):
    def __init__(self):
        self.fenster=Tk()
        self.informationsLabel=Label(self.fenster,text="Hier kannst du den Klassendurchschnitt berechnen")
        self.notenaufbewahrungsList=list()
        for i in range(1,7):
            self.notenaufbewahrungsList.append((Entry(self.fenster),
                                               Label(self.fenster,text= " Hier kommen die "+str(i)+" rein ")))
                                               
                                               
            
        self.enterKeyButton=Button(self.fenster,text=" Ausrechnen",command=self.ausrechnen)
        self.ausgabe=StringVar()
        self.ausgabe.set("")
        self.ausgabeLabel=Label(self.fenster,textvariable=self.ausgabe)
        self.speichernButton=Button(self.fenster,text="Ausgabe speichern",command=self.speichern)
        
        self.informationsLabel.grid(pady=10,padx=10)
        counter=0
        for i in self.notenaufbewahrungsList:
            for z in i:
                if type(z) is  Label:
                    counter +=1
                    z.grid(padx=10,row=counter,column=2)
                    continue
                z.grid(pady=10)
        self.enterKeyButton.grid(row=counter+1,pady=10,padx=10)
        self.speichernButton.grid(row=counter+1,column=2)
        self.fenster.mainloop()
        
    def ausrechnen(self):
        ausgabeList=[]
        for i in self.notenaufbewahrungsList:
            for z in i:
                if type(z) is Entry:
                    try:
                        
                        ausgabeList.append(int(z.get()))
                    except:
                        self.ausgabe.set(" Ein Feld wurde nicht ausgefüllt")
                        self.ausgabeLabel.grid()
                        return

        
        a,b,c,d,e,f=ausgabeList
        self.ausgabeText=(a+b*2+c*3+d*4+e*5+f*6)/(a+b+c+d+e+f)
        self.ausgabe.set(self.ausgabeText)
        self.ausgabeLabel.grid()
        

    def speichern(self):
        datei=open("Notendurchschnitt.txt","w")
        datei.write("Der Notendurchschnitt betrug am "+ str(time.asctime()) + str(self.ausgabeText))
        datei.close()
        
                
        
        
        
            
a=Notenberechnung()
Ich hafte nicht für schlechten Stil oder sonst welche Fehler, denn das Programm läuft bei mir einwandfrei. Auf das Design hab ich jetzt mal keine Rücksicht genommen (Zeitgrund).
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Newcomer hat geschrieben:... das Programm läuft bei mir einwandfrei.
Es läuft so lange "einwandfrei", wie der Anwender keinen Mist eingibt, wie z.B. 0 0 0 0 0 0.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Ne dann läufts immer noch einwandfrei weil 0 0 0 0 0 ein Value Error bedeutet (-;
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Newcomer hat geschrieben:Ne dann läufts immer noch einwandfrei weil 0 0 0 0 0 ein Value Error bedeutet (-;
Für das von mir genannte Beispiel - 0 0 0 0 0 0 - stimmen weder die Behauptung noch die Begründung.
Auch das Speichern führt im übrigen zu einem Laufzeitfehler, wenn die Eingabefelder nicht mit ordentlichen Werten bestückt sind.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

werd ich testen
denn das kann er nicht in "int" umwandeln!
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Jep ich hatte recht, wird abgefangen. Probiers selber aus
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

numerix meinte nicht, dass du in einem Feld "0 0 0 0 0" eingeben sollest sondern, dass du in jedes Feld eine 0 einträgst.

Das die "Qualität" deines Codes unterirdisch ist, hast du ja bereits selbst festgestellt.
Das Leben ist wie ein Tennisball.
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Tja das stimmt aber ich sagte ja, die Hauptsache ist, dass der code funktioniert und das tut er und wenn ihrs besser könnt postet doch mal n code der wirklich besser ist, sodass wir etwas lernen können. :evil: Und wenn der Benutzer so dumm ist und und in jedes feld null eintippt kann ich nichts dafür. Man sollte schon wissen, dass eine Arbeit nicht von null Menschen geschrieben wird. Und übrigenst der Code sollte auch nur ein Vorschlag sein und nicht gleich in der luft zerissen werden
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Achso und noch was: Das "das" am Anfang schreibt man mit zwei "s"
BlackJack

@Newcomer: Erst forderst Du uns auf uns mit Kritik nicht zurück zu halten, und wenn wir es dann tun, genügt es Dir plötzlich, dass er irgendwie funktioniert und Du beschwerst Dich, das wir ihn tatsächlich kritisieren. Wie unverschämt von uns. ;-)

Und wieso sollten *wir* besseren Code für Dich schreiben? Ist ja schliesslich Deine Aufgabe.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Newcomer hat geschrieben:...und wenn ihrs besser könnt postet doch mal n code der wirklich besser ist, sodass wir etwas lernen können.
Nun ja, Du klappst ja schon beim ersten Anflug von Kritik zusammen. Abgesehen davon, dass Dein Ton völlig unpassend ist und Du damit kaum jemanden motivierst, Dir zu helfen, stehst Du Dir damit selbst im Weg und wirst sicherlich nicht über kleinere Codeschnippsel, die ab und zu mal irgendwie funktionieren, hinauskommen.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Also erstens habe ich das Thema nicht angefangen, sondern nur einen konstruktiven Verbesserungsvorschlag liefern wollen. Zweitens habe ich nicht geschrieben, dass ihr kritisieren sollt, wie BlackJack fälschlicherweise annahm. Und drittens, wenn irgendeiner irgendwelche Emotionen in meinen Ton projiziert, kann ich nichts dafür, denn dieser Satz sollte lediglich eine Aufforderung an euch darstellen, ebenso wie ich einen Verbesserungsvorschlag zu liefern, der nicht "unterirdisch" oder in sonst irgendeiner Form unzureichend ist, sodass wir etwas davon lernen könnten. Denn kritisieren kann ich auch, aber zu zeigen, dass man etwas kann fällt dann vielen schwerer. 8)
BlackJack

@Newcomer: Entschuldigung, dass ich Dich mit dem Fragesteller verwechselt habe.

Was sollte Dein Beitrag denn eigentlich bringen, wenn Du doch schon selber gewusst hast, dass der Code nur funktioniert, vom Entwurf aber nicht gut ist? Was soll der OP daraus denn lernen?
Micky2010
User
Beiträge: 34
Registriert: Donnerstag 19. Mai 2011, 17:06
Wohnort: Hessen

Frage Geschlossen

__________________________________________________________________________________________________________________________________________________________________________________________________________
Errare humanum est, in errore perseverare stultum (Irren ist menschlich, im Irrtum verbleiben ist dumm)
Manus manum lavat (Eine Hand wäscht die andere)
Antworten