Seite 1 von 2

localtime variable in Pickle Dateinamen nutzen

Verfasst: Freitag 24. Juni 2011, 18:25
von Micky2010
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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Freitag 24. Juni 2011, 18:30
von 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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Freitag 24. Juni 2011, 18:32
von anogayales
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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Freitag 24. Juni 2011, 18:34
von EyDu
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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Freitag 24. Juni 2011, 18:34
von numerix
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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 08:54
von mutetella
  • 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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 19:12
von Newcomer
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).

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 19:21
von numerix
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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 19:36
von Newcomer
Ne dann läufts immer noch einwandfrei weil 0 0 0 0 0 ein Value Error bedeutet (-;

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 19:56
von numerix
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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 20:39
von Newcomer
werd ich testen
denn das kann er nicht in "int" umwandeln!

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 20:44
von Newcomer
Jep ich hatte recht, wird abgefangen. Probiers selber aus

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 21:05
von EyDu
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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 21:31
von Newcomer
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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 21:43
von Newcomer
Achso und noch was: Das "das" am Anfang schreibt man mit zwei "s"

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 22:21
von 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.

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Samstag 25. Juni 2011, 22:39
von mutetella
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

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Sonntag 26. Juni 2011, 09:24
von Newcomer
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)

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Sonntag 26. Juni 2011, 10:36
von 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?

Re: localtime variable in Pickle Dateinamen nutzen

Verfasst: Sonntag 26. Juni 2011, 10:47
von Micky2010
Frage Geschlossen

__________________________________________________________________________________________________________________________________________________________________________________________________________