Fehlermeldung beim Verändern einer Textdatei

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.
Antworten
peoplez
User
Beiträge: 8
Registriert: Donnerstag 2. August 2018, 17:08

Hallo Leute,

ich versuche derzeit wieder mit Hilfe eines Buches den Einstieg in Python zu finden. Nun habe ich einen Beispielcode aus dem Buch übernommen und dieser funktioniert leider nur bis zu einem bestimmten Punkt. Das Programm soll ein simples Dialogfenster öffnen, in das man dann einen Ländernamen eingeben kann und vom Com die dazugehörige Hauptstadt angezeigt bekommt. Sollte man ein Land eingeben, welches nicht bekannt ist (Länder und Hauptstädte sind in einer Textdatei untergebracht, welche sich im selben Ordner befindet wie das Programm selbst), erscheint ein zweites Dialogfenster, in das man dann ein Land samt seiner Hauptstadt eingibt. Dieses neue Paar soll dann automatisch in die Textdatei geschrieben werden. Mein Problem ist nun, dass sobald Python ein Land inklusive Hauptstadt in die Textdatei schreibt, ich eine Fehlermeldung in der Shell bekomme (ValueError:not enough values to unpack (expected 2, got 1).



Hier der Code:

Code: Alles auswählen

from tkinter import Tk, simpledialog, messagebox

def datei_lesen():
    with open("hauptstadt.txt") as file:
        for line in file:
            line = line.rstrip("\n")
            land, stadt = line.split("/")
            die_welt[land] = stadt


def datei_schreiben(land_name, stadt_name):
    with open("hauptstadt.txt", "a") as file:
        file.write("\n" + land_name + "/" + stadt_name)


print("Frag Paul - Hauptstädte aus der Welt")
root = Tk()
root.withdraw()

die_welt = {}
datei_lesen()

while True:
    abfrage_land = simpledialog.askstring("Land", "Gib den Namen eines Landes ein:")
    

    if abfrage_land in die_welt:
        ergebnis = die_welt[abfrage_land]
        messagebox.showinfo("Antwort", "Die Hauptstadt von " + abfrage_land + " ist " + ergebnis + "!")

    else:
        neue_stadt = simpledialog.askstring("Sag es mir", "Keine Ahnung! " + "Was ist die Hauptstadt von " + abfrage_land + "?")
        die_welt[abfrage_land] = neue_stadt
        datei_schreiben(abfrage_land, neue_stadt)
         


Kann mir jemand einen Hinweis geben, was ich hier falsch mache? Warum kommt die Fehlermeldung wenn ich der Textdatei etwas hinzufüge?


Mit freundlichen Grüßen
peoplez
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles ab Zeile 15 sollte auch in einer Funktion stehen, dann passiert es nämlich nicht, dass man, aus Versehen, globale Variablen benutzt, wie z.B. `die_welt`, das in `datei_lesen` einfach so benutzt wird, ohne dass es übergeben wurde. Dass `datei_schreiben` zuerst eine Zeile-Ende-Zeichen schreibt ist unüblich, Zeilen werden mit solch einem Zeichen abgeschlossen.
Strings generiert man mit .format und setzt sie nicht mit + zusammen.
Der Fehler entsteht wahrscheinlich, weil irgendwo eine leere Zeile steht. Diese könnte man z.B. ignorieren.
Die Datei `hauptstadt.txt` muß auch nicht im selben Verzeichnis wie das Programm liegen, sondern in dem Verzeichnis, aus dem das Programm gestartet wird.

Code: Alles auswählen

from tkinter import Tk, simpledialog, messagebox

HAUPTSTADT_DATEI = "hauptstadt.txt"
def datei_lesen():
    die_welt = {}
    with open(HAUPTSTADT_DATEI) as lines:
        for line in lines:
            line = line.strip()
            if line:
                land, stadt = line.split("/")
                die_welt[land] = stadt
    return die_welt

def datei_schreiben(land_name, stadt_name):
    with open(HAUPTSTADT_DATEI, "a") as output:
        output.write("{}/{}\n".format(land_name, stadt_name))

def main():
    print("Frag Paul - Hauptstädte aus der Welt")
    root = Tk()
    root.withdraw()
    die_welt = datei_lesen()

    while True:
        abfrage_land = simpledialog.askstring("Land", "Gib den Namen eines Landes ein:")
        if abfrage_land in die_welt:
            ergebnis = die_welt[abfrage_land]
            messagebox.showinfo("Antwort", "Die Hauptstadt von {} ist {}.".format(abfrage_land, ergebnis))
        else:
            neue_stadt = simpledialog.askstring("Sag es mir", "Keine Ahnung! Was ist die Hauptstadt von {}?".format(abfrage_land))
            die_welt[abfrage_land] = neue_stadt
            datei_schreiben(abfrage_land, neue_stadt)

if __name__ == '__main__':
    main()
peoplez
User
Beiträge: 8
Registriert: Donnerstag 2. August 2018, 17:08

Hallo Sirius,
vielen Dank für deine Mühe.


Die Fehlermeldung kam daher, dass der Code immer eine leere Zeile in der Textdatei erzeugt hat.
Werde mir deinen Code nachher auch mal genauer anschauen


danke für die rasche Antwort
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die unerwünschte leere Zeile kommt übrigens daher, dass der ursprüngliche Code die Zeilen nach dem Muster \n + text erzeugt. Die richtige Form für eine Zeile ist aber text + \n. Man könnte sich das \n auch einfach als Tippen der Enter-Taste vorstellen, was man üblicherweise erst dann tut, nachdem man den Zeilentext geschrieben hat und nicht umgekehrt. Wenn Python die Datei dann beim Lesen durchgeht und sofort ein \n sieht, dann wird dies als leere Zeile interpretiert.
Antworten