Seite 1 von 2

Vokabeltrainer stürzt immer ab

Verfasst: Sonntag 26. Dezember 2010, 19:54
von dimka1997
Hallo erstmal, das ist mein erster Beitrag.
Ich hoffe ihr könnt mir bei meinem Problem helfen.
Seit einer Woche programmiere ich mit Python und war natürlich auch sofort begeistert.
Ich habe mich gerade eben daran versucht, einen Vokabeltrainer zu schreiben, der nicht nur Vokabeln abfragen kann, sondern auch etwas Fragen kann, z.B. eine Zeitangabe für Geschichte.
Das Programm stürzt aber immer nach dem Eintragen eines Dateinamen ab und mit dem Debugger kann ich leider auch nicht so gut umgehen :mrgreen:
Hier mal der Vokabeltrainer:

Code: Alles auswählen

import datetime

while True:
    print("1=Fragen eintragen")
    print("2=Antworten abfragen")
    print("3=Beenden")
    menu=int(input())

    if menu==1:
        anzahl=int(input("Wie viele Paare willst du eintragen: "))
        fout=open(input("In welcher Datei sollen die Daten gespeichert werden: "),"a+")
        for line in range(1,anzahl):
            frage=input("Frage: ")
            antwort=input("Antwort: ")
            fout.write(frage + "#" + antwort + "#" + "1" + "#" + datetime.date.today()+"\n")
        fout.close()

    if menu==2:
        file=input("Aus welcher Datei sollen die Daten gelesen werden: ")
        fin=open(file,"r")
        fout=open("temp.txt","w")
        for line in fin:
            words=line.split("#")
            if datetime.date.today() == words[3]:
                print("Frage: " + str(words[0]))
                antwort1=input("Antwort: ")
                print("Die Antwort ist: " + words[1])
                richtig=input("Ist deine Antwort richtig? [j]a/[n]ein:")
                if richtig=="j":
                    fout.write(words[0] + "#" + words[1] + "#" + str(int(words[2])+1) + "#" + datetime.date.today()+datetime.timedelta(int(words[2]))+"\n")
                else:
                    words[2]="1"
                    fout.write(words[0] + "#" + words[1] + "#" + words[2] +"#"+datetime.date.today()+datetime.timedelta(int(words[2]))+"\n")
        fin.close()
        fout.close()
        fin=open("temp.txt","r")
        fout=open(file,"w")
        for line in fin:
            fout.write(line+"\n")
        fin.close()
        fout.close()

    if menu==3:
        break
Mfg Dimitri

Re: Vokabeltrainer stürzt immer ab

Verfasst: Sonntag 26. Dezember 2010, 20:37
von Trichter
Bekommst du eine Fehlermeldung?
Wenn ja, dann poste die bitte auch noch.

Bei mir öffnet das Skript eine Datei ohne Probleme, bricht aber beim Schreiben ab, weil es ein datetime Objekt nicht einfach in einen String umwandeln kann. Evt. liegt dein Fehler ja dort und gar nicht beim Öffnen der Datei.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Sonntag 26. Dezember 2010, 20:53
von dimka1997
Ich hab das datetime Objekt mithilfe von str() in ein String umgewandelt, aber das Programm stürzt trotztem ab und das jetzt sogar ohne Fehlermeldung :mrgreen:
Wenn ich den Befehl in der Shell eingebe, liefert write() den String 22 zurück. :K

Re: Vokabeltrainer stürzt immer ab

Verfasst: Sonntag 26. Dezember 2010, 21:23
von Darii
Wie kommst du dann drauf dass das Programm abstürzt, wenn keine Fehlermeldung o.Ä. kommt?

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 02:45
von problembär
Hallo dimka1997,

Dein Problem: "input()" erwartet "int" oder "float". Was Du willst, ist "raw_input()" (Python 2.4), das speichert erstmal alles als "str".

An den Anfang solltest Du IMHO folgendes setzen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
Das vermeidet Probleme bei Eingabe und Speichern von äöü usw.

Code: Alles auswählen

file=input("Aus welcher Datei sollen die Daten gelesen werden: ")
ist nicht so gut, da "file()" schon eine Standardfunktion ist. Nutze wenigstens "file_ =", besser "filename = ".

Gruß

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 11:08
von Dauerbaustelle
problembär hat geschrieben:An den Anfang solltest Du IMHO folgendes setzen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
Nö, das hat nix mit input() o.ä. zu tun; das gibt nur das Encoding an, in dem die Python-Datei steht. Außerdem muss man nicht dieses komische "-*-"-Gewurschtel machen, das reicht auch:

Code: Alles auswählen

# coding: utf-8

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 14:33
von Darii
problembär hat geschrieben:An den Anfang solltest Du IMHO folgendes setzen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
Das vermeidet Probleme bei Eingabe und Speichern von äöü usw.
Für solche Tipps sollte man eigentlich Schläge verteilen. ;) Wenn dann bitte utf8.

Sollte unicode nicht gehen, weil der Editor aus dem vorletzten Jahrtausend stammt, dann bitte zumindest ISO-8859-15, das hat wenigstens das Euro-Zeichen.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 14:44
von BlackJack
Also am besten ist es ja doch noch dort die Kodierung hin zu schreiben, die auch tatsächlich zum Speichern der Datei verwendet wird. :-)

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 18:16
von Darii
BlackJack hat geschrieben:Also am besten ist es ja doch noch dort die Kodierung hin zu schreiben, die auch tatsächlich zum Speichern der Datei verwendet wird. :-)
So lange der Threadstarter sich noch nicht bequemt hat mal die Fehlermeldung zu postet, wäre es sowieso am besten nichts zu schreiben. ;)

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 21:34
von problembär
Dauerbaustelle hat geschrieben:
problembär hat geschrieben:An den Anfang solltest Du IMHO folgendes setzen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-
Nö, das hat nix mit input() o.ä. zu tun; das gibt nur das Encoding an, in dem die Python-Datei steht.
Wohl wahr, das bezog sich nicht auf "input()".
Sondern darauf, daß der OP in seinem Code deutschen Text z.B. über "print" ausgibt.
Wenn man da nicht das Encoding der Python-Datei mit angibt, gibt's Fehlermeldungen, sobald Umlaute auftauchen.
Außerdem muss man nicht dieses komische "-*-"-Gewurschtel machen, das reicht auch:

Code: Alles auswählen

# coding: utf-8
Ok, interessant. Das mit den Sternen hatte ich von irgendwo übernommen. Scheint aber immer noch recht gebräuchlich zu sein. Wenn's auch ohne geht (was so aussieht), ist mir's auch lieber.

Mit "iso-8859-1" hatte ich noch nie Probleme beim Lesen und Schreiben von/aus Dateien oder zum Bildschirm, weder unter Linux (SuSE 10.0) noch unter Windows (98 SE). Mit "utf-8" dagegen manchmal schon. Ich bleibe daher bei "iso" und empfehle das auch weiterhin. So.

Gruß

Re: Vokabeltrainer stürzt immer ab

Verfasst: Montag 27. Dezember 2010, 23:09
von BlackJack
@problembär: "Mach das mal so weil *ich* hatte damit nie Probleme, habe aber eigentlich keine Ahnung" ist vielleicht nicht beste Grundlage um Ratschläge zu geben. :roll:

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 13:06
von dimka1997
Ich programmiere unter windows mit der von python mitgelieferten entwicklungsumgebung(lxde oder so ähnlich :mrgreen: )
das programm endet bei mir ohne fehlermeldung, nachdem ich das datetime objekt mithilfe von str() in einen string umwandele.
gibt es vieleicht einen anderen weg, um das karteikartensystem zu realisieren?
sorry wegen den den ganzen rechtschreibfehlern, bin grad mit meinem handy im netz

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 21:02
von problembär
BlackJack hat geschrieben:@problembär: "Mach das mal so weil *ich* hatte damit nie Probleme, habe aber eigentlich keine Ahnung" ist vielleicht nicht beste Grundlage um Ratschläge zu geben. :roll:
Doch doch, das ist genau der Ansatz in einem Internetforum: Kostenloser Erfahrungsaustausch und Hilfestellung von Leuten, die sich mit einem Thema als Hobby beschäftigen.
Wenn Du mehr erwartest oder verlangst, bist Du wohl eher hier falsch. :roll:

@dimka1997: Fehlermeldung hin oder her: Was ist denn nun mit "raw_input()"?

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 21:25
von cofi
Das ist nicht hilfreich. Die von Python mitgelieferte IDE hiesst IDLE und ist ist nicht eine Unix Desktopumgebung.
Starte das Skript von der Kommandozeile (http://wiki.python-forum.de/FAQ#Wie_sta ... Skripte.3F) und erzaehl uns was ueber die Exceptions die dabei rausspringen.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 22:47
von BlackJack
@problembär: Das hat weder etwas mit "dem Ansatz von Internetforen" zu tun -- als wenn es da diesen einen Ansatz gäbe -- noch das es auch Ratschläge von Hobbyisten sind. Das Ziel sollte auch dort sein die Probleme zu verstehen und zu lösen, statt Voodoo zu betreiben. Unicode ist etwas was heutzutage auch Hobbyprogrammierer verstehen müssen, denn früher oder später wird man damit in Kontakt kommen. Programme die nur zufällig funktionieren, sollten für Programmierer jedweden Kenntnisstandes nicht akzeptabel sein.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 23:11
von DasIch
problembär hat geschrieben:
Außerdem muss man nicht dieses komische "-*-"-Gewurschtel machen, das reicht auch:

Code: Alles auswählen

# coding: utf-8
Ok, interessant. Das mit den Sternen hatte ich von irgendwo übernommen. Scheint aber immer noch recht gebräuchlich zu sein. Wenn's auch ohne geht (was so aussieht), ist mir's auch lieber.
Emacs nutzt die Syntax, deswegen wird sie recht häufig verwendet.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Dienstag 28. Dezember 2010, 23:27
von dimka1997
@problembär
ich benutze python 3, da macht input() doch das selbe wie raw_input() in 2.6

Re: Vokabeltrainer stürzt immer ab

Verfasst: Mittwoch 29. Dezember 2010, 02:55
von problembär
BlackJack hat geschrieben:Das Ziel sollte auch dort sein die Probleme zu verstehen und zu lösen, statt Voodoo zu betreiben. Unicode ist etwas was heutzutage auch Hobbyprogrammierer verstehen müssen, denn früher oder später wird man damit in Kontakt kommen.
Richtig ist, daß auf meinem Linux-System von 2005 noch einiges an Voodoo geschieht, wenn man es auf "UTF-8" läßt, weil allerhand Programme damit noch nicht umgehen konnten, sondern "ISO-8859-1" ("Latin 1") erwarteten, womit es keine Probleme gab. Bin nicht sicher, ob das inzwischen besser ist.
Das Thema "Encodings" (in dem Link verwendet sogar Gerold die Sterne!) ist ja nicht nur für mich bis zu einem gewissen Grade etwas mysteriös, sondern verwirrt auch viele andere.

@dimka1997: Mir ist nicht ganz klar, was Du mit dem Timedelta wolltest. Ich hab' mal die datetime-Teile rausgenommen. Ansonsten versuche ich auch immer, gleichzeitiges Lesen und Schreiben von Dateien zu vermeiden, sondern das möglichst nacheinander zu machen. Was mir noch aufgefallen ist, ist, daß Du vielleicht versucht hast, in einer Zeile zu viele Sachen gleichzeitig zu formulieren, so daß Du Dich dann vielleicht etwas verhakt hast. Das ist normal. Versuche, die Dinge so einfach wie möglich zu schreiben und auch in einzelne Problemfelder zu teilen (später auch mit Funktionen). Also erstmal einfach, später dann weiteres implementieren, wie z.B. die datetime-Sachen.
Sieht dann erstmal ohne (in Python 2.4, gegebenenfalls bitte umschreiben) z.B. so aus:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

import os

dbsep = "#"

while True:

    print "1 = Fragen eintragen" 
    print "2 = Antworten abfragen" 
    print "3 = Beenden" 
    
    menu = int(raw_input())

    if menu == 1:
        anzahl = int(raw_input("Wie viele Paare willst du eintragen: "))
        fname = raw_input("In welcher Datei sollen die Daten gespeichert werden: ")
        fout = file(fname, "w")
        for line in range(1, anzahl + 1):
            frage = raw_input("Frage: ")
            antwort = raw_input("Antwort: ")
            fout.write(frage + dbsep + antwort + dbsep + "1" + os.linesep)
        fout.close()

    if menu==2:
        fname = raw_input("Aus welcher Datei sollen die Daten gelesen werden: ")
        fin = file(fname, "r")
        inlines = fin.readlines()
        fin.close()
        outlines = []
        for line in inlines:
            line = line.rstrip(os.linesep)
            words = line.split(dbsep)
            if words[2] == "1":
                print("Frage: " + words[0])
                antwort1 = raw_input("Antwort: ")
                print "Die Antwort ist: " + words[1]
                richtig = raw_input("Ist deine Antwort richtig? [j]a/[n]ein:")
                if richtig == "j":
                    words[2] = str(int(words[2]) + 1)
                outlines.append(dbsep.join(words))
        fout = file(fname, "w")
        for line in outlines:
            fout.write(line + os.linesep)
        fout.close()

    if menu == 3:
        break
Gruß

Re: Vokabeltrainer stürzt immer ab

Verfasst: Mittwoch 29. Dezember 2010, 13:48
von Darii
problembär hat geschrieben:Richtig ist, daß auf meinem Linux-System von 2005 noch einiges an Voodoo geschieht, wenn man es auf "UTF-8" läßt, weil allerhand Programme damit noch nicht umgehen konnten, sondern "ISO-8859-1" ("Latin 1") erwarteten, womit es keine Probleme gab.
Dann ist die Verwendung von nicht-utf8 in Python aber die falsche Lösung. Wenn Programme latin1 als Eingabe erwarten, dann musst du denen auch latin1 vorsetzten. Das erreicht man mit unicode-Strings und dem entsprechenden decode-Aufruf. Oder auch ggf. dem codecs-Modul und dein Linux verträgt evtl. auch mal ein Update.

Und ich wiederhole es gerne nochmal: latin-1 ist die falsche Kodierung für ein deutsches System. Wir haben hier latin-9. latin-1 hat kein Euro-Zeichen.

Re: Vokabeltrainer stürzt immer ab

Verfasst: Donnerstag 30. Dezember 2010, 20:26
von problembär
Darii hat geschrieben:Und ich wiederhole es gerne nochmal: latin-1 ist die falsche Kodierung für ein deutsches System. Wir haben hier latin-9. latin-1 hat kein Euro-Zeichen.
Als "Euro-Zeichen" nutze ich immer "EUR". Das akzeptieren Kunden, Geschäftspartner und das Finanzamt, also eigentlich alle.
"25,- EUR" sieht auch ok aus.