Seite 1 von 1

python Vokabelprogramm

Verfasst: Mittwoch 18. April 2012, 16:55
von fantasticPython
Moin,


Ich absolviere momentan ein Praktikum als fachinformatiker im bereich anwendungsentwicklung und ich soll ich ein Vokabelprogramm erstellen, doch ich hab etwas schwierigkeiten es zu programmieren.

Aufgabenstellung:

Erstelle ein Vokabelprogramm mit folgenden Funktionen

1.Eingabe neuer Vokabeln
2.Abfrage von Vokabeln (lernen)
3.Speichern der Vokabel in eine Datei
4.ändern und ergänzen von Vokabeln.

ich hab schon einwenig programmiert nur bekomme ich keine lösungen es hängt immer oder es gibt eine fehlermeldung aus ich sitze schon 2-3 tage dran :(

Code: Alles auswählen

dict = {'key2':'Wert2', 'key1':'Wert1','key3':'Wert3', 'key4':'Wert4'}

import sys

def buchslesen (key,value):
    Buch = open("datei2.txt", "r")
    Buch.readlines()
    return Buch

def worteingeben (dict):
    key = input("Geben Sie ein Wort ein: ")
    if key in dict:
        print ("Das deutsche Wort dafür lautet:"), dict[key]
        print (dict[key]);
    else:
        print ("Das Wort existiert nicht in meinem Wörterbuch")
        "einfügen" == input("Möchten Sie das Wort einfügen")
        buchschreiben(key,'value')
        dict.append = {'key5':'Wert5'}

print("Herzlich willkommen")
"begin" == input("Möchten Sie anfangen")
if ("ja"):
    print(" ")
    dict = buchslesen
    worteingeben(buchlesen)
else:("nein")
sys.exit()
ende(worteingabe)
print("schade... dann beim nächsten Mal")


def ende():
    sys.exit("message")
    os._exit()
 



def buchschreiben (key,value):
    Buch = open("datei2.txt", "w")
    Buch.write(key + " " + value + "\n")


Mein anleiter hat es einwenig geändert und ich weiss garnicht mehr wo ich ansetzen soll den es gibt immer ne fehlermeldung. Ich benutze die 3.1.1 version von python

bitte helft mir brauch es bis heute :)

Re: python Vokabelprogramm

Verfasst: Mittwoch 18. April 2012, 17:10
von BlackJack
@fantasticPython: Du möchtest glaube ich erst einmal ganz generell das Python-Tutorial aus der Dokumentation durcharbeiten, bevor Du konkret mit einem Projekt anfängst. Für Python 3.x gibt es davon auch eine deutsche Übersetzung. Suchmaschine Deines Vertrauens hilft da sicher weiter.

Re: python Vokabelprogramm

Verfasst: Freitag 27. April 2012, 00:04
von quink
Is nen komisches Forum hier, ich habe auch ne Anfängerfrage gestellt und kriege Antworten wie schau da und da nach. Dabei ist es doch einfacher einen Anfänger zu helfen wo der Fehler steckt als auf Tutorials zu verweisen..

Ich bin zwar Python Anfänger aber ichs hab bei mir mal laufen lassen, den ersten Fehler habe ich da:
"begin" == input("Möchten Sie anfangen")

änder mal das input in raw_input
(ich habe python 2.7)

den nächsten error siehst du wenn du das programm dann startest, typischer schreibfehler:

du willst was übergeben:

def buchslesen

aber ind er übergabe schreibst du buchlesen, änder das auch mal..

Hoffe dir hilft es etwas weiter :-)

Re: python Vokabelprogramm

Verfasst: Freitag 27. April 2012, 01:02
von BlackJack
@quink: Es mag für den Fragesteller einfacher sein wenn wir ihm hier das Tutorial vorkauen, aber für uns ist es wirklich einfacher wenn er das selber durcharbeitet. Was wäre denn der Sinn jedem Anfänger hier etwas aufs neue zu erklären was es schon fertig in einem gut geschriebenen Tutorial gibt? Der gezeigte Quelltext ist dermassen sinnfrei zusammen gestückelte Textfragmente die irgendwie nach Python aussehen, das es keinen Sinn macht das zu verbessern. Denn das läuft auf ein komplettes neu schreiben hinaus. Wenn *wir* das für den Fragesteller machen, hat *er* dabei Null gelernt. Es fehlt ihm an einem ganz grundlegenden Verständnis der Sprache, wie es von Tutorials für Anfänger vermittelt wird. Dafür sind die da!

Zu der von Dir gestellten Frage gab es zudem keine einfache Antwort, die man Dir geben konnte, weil das einfach viel zu stark von den konkreten Verhältnissen bei Deinem Webspace-Anbieter abhängt, die niemand von uns kennt. Und Webanwendungen sind auch nicht gerade das was ich einem absoluten Anfänger empfehlen würde. Das ist fast noch schwieriger als GUI-Programmierung, weil man neben Programmieren an sich und Python im besonderen auch noch mit einer Menge Technologien wie HTTP, HTML, CSS, JavaScript, Datenbanksysteme, nebenläufige Zugriffe, Cookies, … konfrontiert wird und zwischen dem Programm und dem Benutzer mehrere Schichten — Server, Netzwerk, Browser — liegen, was die Fehlersuche auch nicht gerade vereinfacht.

Re: python Vokabelprogramm

Verfasst: Freitag 27. April 2012, 07:49
von /me
quink hat geschrieben:Ich bin zwar Python Anfänger aber ichs hab bei mir mal laufen lassen, den ersten Fehler habe ich da:
"begin" == input("Möchten Sie anfangen")

änder mal das input in raw_input
(ich habe python 2.7)
Ich gehe davon aus, dass der Fragesteller Python 3.x verwendet, da er print mit Klammern verwendet. Dann ist input völlig korrekt, während es raw_input gar nicht mehr gibt.

Der Fehler ist ganz offensichtlich ein anderer[1]. "Ganz offensichtlich" gilt allerdings nur dann, wenn man sich zumindest elementare Sprachkonstrukte von Python angeeignet hat und dazu ist das Tutorial sehr gut geeignet. Warum sollen wir das gleiche hier noch einmal hinschreiben?

Reduzieren wir das mal auf folgenden Code:

Code: Alles auswählen

begin = 1
"begin" = 1
Warum führt die zweite Zeile zu einem Syntaxfehler? Ein Blick auf die Fehlermeldung bringt Klarheit. Die Meldung "SyntaxError: can't assign to literal" kann eigentlich kaum präziser sein.

*edit* [1]: Ich bin davon ausgegangen, dass eine Zuweisung gemeint ist. Das Problem ist, dass der ganze Code so etwas von kaputt ist und von einem äußerst tiefen Nichtverständnis von Programmierung zeugt, dass man sich einfach nicht sicher sein kann, was gemeint ist.

Re: python Vokabelprogramm

Verfasst: Freitag 27. April 2012, 08:48
von sma

Code: Alles auswählen

dict = {'key2':'Wert2', 'key1':'Wert1','key3':'Wert3', 'key4':'Wert4'}
# "dict" überschreibt einen eingebauten Typ bei Python und ich ein schlechter Name.
# Jede halbwegs gute IDE zeigt das auch an und selbst beim Posten hier sollte auffallen,
# dass der Name anders eingefärbt wird als andere Namen.
#
# Es ist immer empfehlenswert, mit guten Beispielen zu arbeiten, wenn das hier also eine
# Liste von Vokabeln werden soll, dann also auch gleich passende Begriffe benutzen:
#
# vokabeln = {"vocable": "Vokabel"}
#
# Allerdings sollen Vokabeln ja wohl aus einer Datei "datei2.txt" gelesen werden,
# Da muss daher gar nichts initialisiert werden. Übrigens, zweimal ein und den selben
# Dateinamen zu benutzen sollte dazu führen, dass man den als Konstante vereinbart:
# 
# vokabeln = {}
#
# vokabeln_dateiname = "datei2.txt"
#

import sys
# "sys" - und auch das später benutzte "os" sind für dieses Programm unnötig.
# Der Import kann also weg.

def buchslesen (key,value):
# "buchslesen"? Der Blick für Kleinigkeiten ist bei der Software-Entwicklung essentiell,
# denn der Computer verzeiht keinen Schreibfehler und jedes Zeichen ist wichtig.
#
# Was sollen "key" und "value" als Parameter machen?
#
# Da es eine Konvention von Python ist, dort, wo man zwei Wörter benutzen würde, ein "_"
# zu benutzen, würde ich diese Funktion lieber so nennen:
#
# def buch_einlesen():
    
    Buch = open("datei2.txt", "r")
# eine weitere Konvention bei Python ist, lokale Variablen klein zu schreiben:
#
#    buch = open(vokabeln_dateiname)
#
# das "r" kann man übrigens weglassen. Da man Dateien auch wieder schließen muss, ist
# es besser, eine "with"-Anweisung zu benutzen, denn dann macht Python das automatisch,
# also:
#
#    with open(vokabeln_dateiname) as buch:
#
    Buch.readlines()
# Dieser Befehl verpufft einfach so, denn das, was er zurückgibt, wird sofort wieder
# vergessen. Gemeint ist sicherlich etwas wie dieses:
#    zeilen = buch.readlines()
#
    return Buch
# Das ist genau so falsch, denn niemand will das Datei-Objekt haben. Zusammen mit
# "with", kann ich die Funktion wie folgt schreiben:
#
# def buch_einlesen():
#    with open(vokabeln_dateiname) as buch:
#       return buch.readlines() 
#
# Das ist aber noch nicht genug, denn wenn ich meine Vokabeln in einem dict halten
# will, muss ich die Liste der Zeilen aus der Datei in ein dict (ich meine hier jeweils
# den Python-Datentyp dict, nicht die falsch benannte Variable weiter oben) verwandeln.
# Dazu kann ich jede Zeile, in der hoffentlich zwei Wörter stehen mit "split" zerteilen.
# Da dummerweise in jeder Zeile noch ein Zeilenendzeichen ('\n') stehen kann, muss ich
# dieses mit "strip" entfernen, also so:
#
# def buch_einlesen():
#    with open(vokabeln_dateiname) as buch:
#       for zeile in buch.readlines():
#           englisches_wort, deutsches_word = zeile.strip().split() 
#           vokabeln[englisches_wort] = deutsches_word
#
# Nun brauche ich auch keine Rückgabe mehr.
#
# Übrigens, man muss natürlich "buch_einlesen" auch noch irgendwo aufrufen.

def worteingeben (dict):
# Was soll "dict" hier? Wenn schon eine globale Variable, dann soll man auch dazu
# stehen. Hier würde man sie nur mit einer lokalen Variable überschreiben. 
# Und wir erinnern uns an die Regel mit dem "_", ja?
#
    key = input("Geben Sie ein Wort ein: ")
# "key" ist ein schlechter Name. Der Prompt von input und auch der Name der Funktion
# suggerieren einen besseren Namen. Also warum nicht "wort", wo doch sonst auch alles
# deutsch ist?
#
    if key in dict:
        print ("Das deutsche Wort dafür lautet:"), dict[key]
        print (dict[key]);
# Diese drei Zeilen sind übrigens fast korrekt. Wenn man die Argumente bei "print"
# Klammern muss, was du ja herausgefunden oder übernommen hast, warum steht dann 
# das "dict[key]" nicht auch in der Klammer? Und was soll das ";" bewirken? Muscle
# memory durch Java-Programmierung? Kann ich mir aber eigentlich nicht vorstellen,
# denn dann wären auch die grundsätzlichen Konstrukte bei Python schon bekannt.
# Also: Das ";" kann einfach weg und die ")" beim ersten print muss nach ganz hinten.
# Und die dritte Zeile ist natürlich eigentlich redundant.
#
#   if wort in vokabeln:
#       print("Das deutsche Wort lautet", vokabeln[wort])
#
    else:
        print ("Das Wort existiert nicht in meinem Wörterbuch")
        "einfügen" == input("Möchten Sie das Wort einfügen")
# Dies macht syntaktisch keinen Sinn. Wieder verpufft ein Ausdruck, weil er nirgends
# gespeichert wird. Wenn ich eine Variable mit einem Wert vergleichen will, dann halte
# ich es für natürlicher, es auch so rum aufzuschreiben. Die Konstante nach vorne zu
# ziehen, ist ein C-ism, der daraus resultiert, dass man sich mit "=" und "==" leicht
# vertippen kann und es nicht merkt, weil C beides akzeptiert. Bei Python kann man 
# diesen Fehler nicht machen bzw. es ist ein echter Fehler. Wie auch immer, ich bin mir
# sicher, hier fehlt ein "if"
#
#   if input("Möchten Sie das Wort einfügen?") == "ja":

        buchschreiben(key,'value')
        dict.append = {'key5':'Wert5'}
# Wirklich? Key5 und Wert5? Müssten wir nicht noch nach der Übersetzung fragen? Warum
# all die konstanten Strings? Übrigens, da "buchschreiben" (welches "buch_schreiben")
# heißen sollte) ja die Datei ersetzt und nicht ergänzt, wäre es total praktisch, erst
# das Wort zu "dict" aka vokabeln hinzuzufügen und dann erst zu speichern.
#
#       vokabeln[wort] = input("Wie lautet die Übersetung?")
#       buch_abspeichern()

print("Herzlich willkommen")
# Yeah, kein Fehler :)
"begin" == input("Möchten Sie anfangen")
# Das verpufft wieder wirkungslos.
if ("ja"):
# Das ist syntaktisch wieder Müll, wird aber wohl von Python geschluckt, da fast alles
# (außer False, None, "", 0 und leeren Listen) als wahr gilt und somit "ja" den
# Wahrheitswert "True" hat (was man mit bool("ja") prüfen kann). Hier fehlt die Variable,
# in der man sich die Frage von einer Zeile davor gemerkt hat.
#
    print(" ")
# kann man machen, muss man aber nicht...

    dict = buchslesen
# Hier wird dict die Funktion selbst zugewiesen, nicht das Ergebnis des Funktionsaufrufs.
# Da wir aber inzwischen buch_lesen() als Funktion, die eine globale Variable verändert
# und daher nichts zurückgeben muss definiert haben, kann das so aussehen:
#
#   buch_einlesen()
    worteingeben(buchlesen)
# wenn überhaupt, dann wäre hier "dict" richt.
#
#   wort_eingeben()
else:("nein")
# das ("nein") verpufft. Noch schlimmer, es verhindert, dass man hinter else: einen
# eingerückten Block von weiteren Anweisungen eingeben kann. Genau das will man aber
sys.exit()
# Wie oben erwähnt, "sys.exit" ist unnötig. 
ende(worteingabe)
# Insbesondere, wenn man danach noch versucht eine Funktion aufzurufen, die noch
# 2x das selbe versucht.
#
print("schade... dann beim nächsten Mal")
# und danach dann versucht, etwas auszugeben. Einzig diese Zeile kann stehen bleiben.

def ende():
    sys.exit("message")
    os._exit()
# Diese Funktion kann weg und "os" wäre eh ein Fehler, da dieses Modul nie importiert
# wurde. Der "_" macht übrigens klar, dass das eine interne FUnktion ist, von der man
# die Finger lassen soll. 

def buchschreiben (key,value):
# Hier will ich dies haben:
#
# def buch_abspeichern():
#
    Buch = open("datei2.txt", "w")
# Wir erinnern uns an "with"?
#
#    with open(vokabeln_dateiname) as buch:
#
    Buch.write(key + " " + value + "\n")
# Nun müssen wir alle Einträge in einer Schleife abspeichern:
#
#       for englisches_wort, deutsches_word in vokabeln.items():
#           buch.write(englisches_wort + " " + deutsches_word + "\n")
#
# Und das war's dann auch schon.
# Ach ja, diese Funktion muss noch über das Hauptprogramm geschoben werden, sonst findet
# Python sie nicht, bzw. das Hauptprogramm, also die Anweisungen, die nicht in einem "def"
# stehen sollte immer ganz unten in einer Datei stehen.
Stefan

Re: python Vokabelprogramm

Verfasst: Freitag 27. April 2012, 08:52
von anymagical
Hallo,

ich haben mal folgenden Tip gelesen:

Code: Alles auswählen

"Immer wenn du den Programmablauf nicht verstehst oder Fehler suchst streue prints in den Code ein

Code: Alles auswählen

print("Herzlich willkommen")
# Meines Wissens nach wird "==" benutzt um herrauszufinden ob etwas True oder False ist. Sowie dass die Variable welche einen Wert erhalten soll nicht in "" gesetzt wird.
"begin" == input("Möchten Sie anfangen")
# if was ja?
if ("ja"):
    print(" ")
# ab hier wird dein das in der ersten Zeile angelegte dict überschrieben mit <function buchslesen at 0x26b50d8>
    dict = buchslesen
    worteingeben(buchlesen)
# Ein else sieht imho folgender Maßen aus:
# else:
#    ...
#    ...
else:("nein")
sys.exit()
ende(worteingabe)
print("schade... dann beim nächsten Mal")
Grüße
Anymagical

// Da war wohl jemand noch ausführlicher

Re: python Vokabelprogramm

Verfasst: Dienstag 22. Mai 2012, 01:01
von quink
Also, ich habe mal nach den Angaben von sma versucht das Programm zu basteln:

Code: Alles auswählen

# Vokabelprogramm - Python 2.7.2.1
vokabeln = {}
vokabeln_dateiname = "c:\datei.txt"

def buch_abspeichern():
    buch = open(vokabeln_dateiname)
    with open(vokabeln_dateiname) as buch:
     buch.write(key + " " + value + "\n")
     for englisches_wort, deutsches_word in vokabeln.items():
        buch.write(englisches_wort + " " + deutsches_word + "\n")
    print("Wort gespeichert")
    wort_eingeben()

def buch_einlesen():
     buch = open(vokabeln_dateiname)
     with open(vokabeln_dateiname) as buch:
       for zeile in buch.readlines():
         englisches_wort, deutsches_word = zeile.strip().split()
         vokabeln[englisches_wort] = deutsches_word
     wort_eingeben()

def wort_eingeben():
     wort = input("Geben Sie ein Wort ein: ")
     if wort in vokabeln:
        print("Das deutsche Wort lautet", vokabeln[wort])
     else:
        print ("Das Wort existiert nicht in meinem Wörterbuch")
        if raw_input("Möchten Sie das Wort einfügen? (ja/nein)") == "ja":
          vokabeln[wort] = raw_input("Wie lautet die Übersetung?")
          buch_abspeichern()

print("Herzlich willkommen")
if raw_input("Möchten Sie anfangen? (ja/nein)") == "ja":
   buch_einlesen()
else:("nein")
print("schade... dann beim nächsten Mal")
Nun habe ich auf c ne leere Datei erstellt: datei.txt
Da steht noch nix drin! Nun starte ich das Programm und er meckert:

ValueError: need more than 0 values to unpack
und markiert mir diese Zeile als Fehler:
englisches_wort, deutsches_word = zeile.strip().split()

Ich komm nicht dahinter wo der Fehler steckt :K
So viel ich verstehe will er ein englisches Wort UND ein deutsches Wort haben, aber in der Datei is ja nix drin.. Und nu?? Wie muß das Programm verändert werden das er wenn nix drin steht weitermacht?

Ach so, wenn ich was in die Datei reinschreibe, zb:
Haus, house
meckert er auch :(

Und noch etwas, bei mir wird in der Frage-Textbox keine deutsche Sonderzeichen angezeigt, wie kann man das machen das er deutsche Sonderzeichen anzeigt?

Re: python Vokabelprogramm

Verfasst: Dienstag 22. Mai 2012, 06:09
von Hyperion
quink hat geschrieben: ValueError: need more than 0 values to unpack
und markiert mir diese Zeile als Fehler:

Code: Alles auswählen

englisches_wort, deutsches_word = zeile.strip().split()
Ich komm nicht dahinter wo der Fehler steckt :K
Dieser Fehler kann so nicht auftreten, wenn die Datei wirklich leer ist. Er kann nur auftreten, wenn in der Datei Zeichen stehen. Bist Du sicher, dass da keine Whitespaces enthalten sind?

Zudem solltest Du uns immer den *kompletten* Fehler hier posten, also die vollständige Fehlerausgabe des Interpreters.

Dein Parser - also das, was in `buch_einlesen` passiert - ist wenig "robust". Du gehst davon aus, dass in jeder Zeile genau zwei Wörter stehen, die durch Whitespaces getrennt sind. Sobald da nur ein Wort oder auch mehrere drin stehen, kracht es.

Ich simuliere das mal in einer Shell:

Code: Alles auswählen

In [8]: a, b = "hello hallo".split()

In [9]: a, b = "hello hallo foo".split()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/nelson/src/Python/forum/<ipython-input-9-b6c7c598eafe> in <module>()
----> 1 a, b = "hello hallo foo".split()

ValueError: too many values to unpack (expected 2)

In [10]: a, b = " ".split()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/nelson/src/Python/forum/<ipython-input-10-b27890d4aff3> in <module>()
----> 1 a, b = " ".split()

ValueError: need more than 0 values to unpack
In [8] klappt das Parsen, in [9] habe ich zu viele Werte für die beiden Namen und in [10] zu wenige. So etwas kann man leicht in einer Shell ausprobieren! (hier IPython, also nicht durch den [zahl]-prompt verwirren lassen, sonst steht da ">>>")
quink hat geschrieben: So viel ich verstehe will er ein englisches Wort UND ein deutsches Wort haben, aber in der Datei is ja nix drin.. Und nu?? Wie muß das Programm verändert werden das er wenn nix drin steht weitermacht?
Sofern wirklich *nichts* in der Datei steht, musst Du nichts ändern, da dann die Schleife erst gar nicht durchlaufen wird.

quink hat geschrieben: Ach so, wenn ich was in die Datei reinschreibe, zb:
Haus, house
meckert er auch :(
Auch hier gilt: Wir brauchen die *exakte* Fehlermeldung. Eigentlich sollte das nicht passieren... insofern muss es sich um einen anderen Fehler oder eine andere Stelle im Code handeln!
quink hat geschrieben: Und noch etwas, bei mir wird in der Frage-Textbox keine deutsche Sonderzeichen angezeigt, wie kann man das machen das er deutsche Sonderzeichen anzeigt?
Was ist die "Frage-Textbox"? Meinst Du die Shell? Generell sind das immer Encoding-Probleme. Lies Dir dazu mal die Links in meiner Signatur durch.

Btw: Die Namen sind der Hammer... `deutsches_word` :-D

Generell solltest Du imho *alles* wegwerfen und bei null anfangen. Ich versuche das mal zu begründen:

Du fängst inhaltlich an der falschen Stelle an. Was interessiert Dich denn die Datei und das Format, in der Du die Vokabeln speicherst? Persistenz ist ja gut und schön, sollte aber imho nicht zu Beginn der Entwicklung stehen! (Zumindest nicht bei solch einfachen Projekten) Du solltest Dich erst einmal auf das Wesentliche, also das Testen von Vokabeln, ggf. die Bewertung eines Tests usw. bemühen. Beispielvokablen kann man sich doch zunächst locker *statisch* im Programm hinterlegen:

Code: Alles auswählen

VOCABULARIES = {
    "hello": "Hallo",
    "world": "Welt",
    ...
}
Damit kann man erst einmal alles zur Genüge testen.

"Testen" ist ein weiteres wichtiges Stichwort in diesem Zusammenhang. Wieso hast Du bereits 30, 40 Zeilen Code, wenn Du an einer zentralen Stelle einen Fehler hast? Vermutlich hast Du `buch_abspeichern` noch gar nicht laufen lassen? Du musst Code immer so schreiben, dass Du Funktionen *separat* von anderen testen kannst. Ich stelle mir irgend wie vor, dass Du dieses Programm einfach so runter geschrieben hast. So darfst Du *nie* vorgehen.

Generell solltest auf globale Variablen verzichten! Schreibe Deine Funktionen so, dass sie die notwendigen Daten als Parameter übergeben bekommen müssen. Also bei `wort_eingeben` z.B. das Dictionary mit den Vokabeln, beim Laden den Dateinamen usw. Wenn diese Funktionen Daten generieren, dann sollten sie diese per `return` an die aufrufende Funktion zurückgeben. Das käme z.B. beim Laden zum Tragen.

Du hast eine ungewollte Rekursion in Deinem Programm! Du rufst aus den Funktionen andere Funktionen auf, ohne jemals zurück zu springen. Aus `buch_einlesen` springst Du in `wort_eingeben` in `buch_abspeichern` und von dort in `wort_eingaben` und so geht das weiter, bis der Stack voll ist. Dann gibt es einen Fehler...

Du kannst das mal selber austesten:

Code: Alles auswählen

In [14]: def foo():
   ....:     bar()
   ....:     

In [15]: def bar():
   ....:     foo()
   ....:     
Wenn Du nun eine der beiden Funktionen aufrufst, wirst Du nach einiger Zeit diese Meldung erhalten:

Code: Alles auswählen

RuntimeError: maximum recursion depth exceeded
;-)

Schreibe Dein Programm so um, dass Du aus einem Menü heraus auswählen kannst, welche Aktion Du als nächstes vornehmen willst. Wenn Du Wörter in das Wörterbuch hinzufügen willst, dann musst Du diese ja nicht sofort speichern. Das kannst Du ja auch später erledigen, sprich, sobald Du die entsprechende Option ausgewählt hast. Willst Du das dennoch sofort erledigen, so kehre aus der "Speichern"-Funktion einfach zurück. Das geht ja einfach so, *ohne* dass Du irgend etwas tun musst ;-)

Du solltest Deine Funktionen so benennen, dass sie die Logik auch widerspiegeln. `wort_eingeben` macht ja viel mehr als das, was der Name ausdrückt. Es fügt ein neues Pärchen dem Dictionary hinzu und speichert das veränderte Wörterbuch ab. Das würde niemand erwarten, der nur den Namen "wort_eingeben" liest. Namen sind sehr sehr wichtig! (Und leider schwierig passend zu wählen ;-) )

Achte auch bitte auf die Formatierung Deines Codes. Lies Dir dazu mal PEP8 durch. Das schreibt vier Spaces als Einrückungsebene vor. Bei Dir schwankt das irgend wie zwischen fünf und zwei...

Bei Dateipfaden solltest Du auch immer Raw-Strings verwenden, da es sonst zu ungewollten Escape-Sequenzen kommen kann:

Code: Alles auswählen

vokabeln_dateiname = r"c:\datei.txt"
(Beachte das "r" vor dem String-Literal!)

Als letztes: Wenn Du Python 2.x verwendest, dann lass die Klammern beim `print` weg! `print` ist in Python 2.7 ein Statement - also "tarne" es nicht als Funktion. Wo kommt das eigentlich her? Man liest das in letzter Zeit immer mehr... sollte das Tutorial aus dem "Freien Magazin" doch so beliebt sein? :-D

Als letztes gebe ich Dir noch einen Tipp: Benutze das `csv`-Modul, um Dein Wörterbuch in eine Datei zu schreiben, oder es aus dieser zu laden. Dann musst Du Dich nicht um das Parsen selber kümmern. Noch einfacher wäre es in diesem Falle sogar mit dem `json`-Modul. Damit kämst Du auf jeweils *eine* Zeile fürs Speichern und Laden (ohne die Zeile zum Öffnen der Datei).

Ach ja, das Dateihandling ist bei Dir auch Grütze. Erkläre mir doch mal, was diese beiden Zeilen machen:

Code: Alles auswählen

    buch = open(vokabeln_dateiname)
    with open(vokabeln_dateiname) as buch:
Und wenn Du das nicht kannst, lies es eben noch mal in Deinem Tutorial nach. (Kleiner Tipp: Eine Zeile davon ist mindestens überflüssig ;-) )

So, ich hoffe das hat Dich nicht demotiviert, sondern hilft Dir, Dich weiter zu verbessern! In diesem Sinne habe ich es geschrieben - also nicht in den falschen Hals bekommen. Lernen kannst Du nur durch (konstruktive) Kritik :-)

Re: python Vokabelprogramm

Verfasst: Mittwoch 30. Mai 2012, 22:14
von quink
Schreibe Dein Programm so um,
Das ist doch nicht mein Programm, das ist oben von fantasticPython und ich habe nur nach den Angaben von sma versucht das Programm zu basteln..
Dieser Fehler kann so nicht auftreten, wenn die Datei wirklich leer ist.
Ist leer, kein Zeichen drin
Habe es aber auch getestet da reinzuschreiben:
Haus house
also getrennt durch ein Leerzeichen, bei beiden (total leere Datei und bei Datei wo Haus house drinsteht selber Fehler:

Code: Alles auswählen

>>> 
*** Remote Interpreter Reinitialized  ***
>>> 
Herzlich willkommenHerzlich willkommen
 
Traceback (most recent call last):
  File "<module1>", line 41, in <module>
  File "<module1>", line 29, in buch_einlesen
  File "<string>", line 530, in Win32Input
  File "<string>", line 1, in <module>
NameError: name 'house' is not defined
Wo steckt da der Fehler? Läuft das bei euren Pythons? Ich benutze hier übrigens Python portable v2.4.1.0, download war von hier:
http://portablepython.com/wiki/PortablePython2.7.3.1
Was ist die "Frage-Textbox"? Meinst Du die Shell?
Ich denke mal das du Linux benutzt, ich hier Windows. Bei mir sieht das so aus wenn ichs starte:
Bild

Das Fenster da, das meinte ich mit Textbox. Da stehen keine deutschen Sonderzeichen drin, obwohl sie im source drin stehen, daher die Frage wie man die Sonderzeichen (hier ein kleines ö anzeigen kann)
Schreibe Dein Programm so um, dass Du aus einem Menü heraus auswählen kannst, welche Aktion Du als nächstes vornehmen willst.
Menü zum anklicken das geht mit Python??
Die Namen sind der Hammer... `deutsches_word`
Bei Dateipfaden solltest Du auch immer Raw-Strings verwenden
Wenn Du Python 2.x verwendest, dann lass die Klammern beim `print` weg!
geändert, nun siehts so aus:

Code: Alles auswählen

#
#!/usr/bin/env python

# Vokabelprogramm - Python 2.7.2.1
vokabeln = {}
vokabeln_dateiname = r"c:\datei.txt"

def buch_abspeichern():
    buch = open(vokabeln_dateiname)
    with open(vokabeln_dateiname) as buch:
     buch.write(key + " " + value + "\n")
     for englisches_wort, deutsches_wort in vokabeln.items():
        buch.write(englisches_wort + " " + deutsches_wort + "\n")

def buch_einlesen():
     buch = open(vokabeln_dateiname)
     with open(vokabeln_dateiname) as buch:
        for zeile in buch.readlines():
            englisches_wort, deutsches_wort = zeile.strip().split()
            vokabeln[englisches_wort] = deutsches_wort
     wort = input("Geben Sie ein Wort ein: ")
     if wort in vokabeln:
        print "Das deutsche Wort lautet", vokabeln[wort]
     else:
        print  "Das Wort existiert nicht in meinem Wörterbuch"
     if raw_input("Möchten Sie das Wort einfügen? (ja/nein)") == "ja":
        vokabeln[wort] = raw_input("Wie lautet die Übersetung?")
        buch_abspeichern()

print "Herzlich willkommen"
if raw_input ("Möchten Sie anfangen? (ja/nein)") == "ja":
   print " "
   buch_einlesen()
else: "nein"
print "schade... dann beim nächsten Mal"
#sys.exit()
Aber halt immer noch der Fehler: NameError: name 'house' is not defined (so wie oben beschreiben) :K

Re: python Vokabelprogramm

Verfasst: Mittwoch 30. Mai 2012, 22:49
von BlackJack
@quink: Was Du da startest ist nicht Python sondern PyScripter. Das ist keine Frage von Linux oder Windows, sondern dass Du eben eine IDE zum ablaufen lassen verwendest und nicht Python direkt. Das da anscheinend Fensterchen aufgehen wenn man `input()` verwendet ist nicht normal, da hat PyScripter anscheinend die Standardfunktionen ersetzt.

Wenn Du Zeichenketten eingeben willst, dann musst Du `raw_input()` verwenden und nicht `input()`. Input versucht die Eingabe als Python-Ausdruck auszuwerten und wenn Du da house eingibst, dann wird halt nach der Variabel `house` gesucht, die nicht definiert ist. Was dann auch die Ausnahme sagt.

Natürlich kann man auch GUIs mit Python programmieren. Portable Python scheint sogar alle verbreiteten GUI-Toolkits dabei zu haben.

Re: python Vokabelprogramm

Verfasst: Mittwoch 30. Mai 2012, 23:04
von Hyperion
Dir ist klar, dass Du nicht einmal die Hälfte der *einfachen* Tipps von mir umgesetzt hast? Von den wirklich grundsätzlichen Dingen bereits abgesehen - obwohl ich mir da viel Mühe gab, Dich gedanklich weiter zu bringen ;-)

Ach ja, bitte benutze doch die Python-Code-Tags: [ code=python ]... [ / code ]

Re: python Vokabelprogramm

Verfasst: Mittwoch 30. Mai 2012, 23:49
von /me
quink hat geschrieben:

Code: Alles auswählen

def buch_abspeichern():
    buch = open(vokabeln_dateiname)
    with open(vokabeln_dateiname) as buch:
       [...]
Du benutzt dieses Konstrukt mit dem doppelten open dauernd. Das ist falsch. Die Zeile mit dem with sollte die vorhergehende Zeile ersetzen, nicht ergänzen.