Erstellen einer Filmdatenbank

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

smodo hat geschrieben: werde es nach deinem schema machen, was übersichtlicher ist und auch sehr logisch aufgebaut...
Was meinst Du mit Schema? Ein Konzept für Dein Film-DB-Projekt oder für das Datenformat, welches Du persistent ablegen willst?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

so, habs neu geschrieben, bin aber noch nicht ganz fertig, in der main fehlen noch verzweigungen.

Code: Alles auswählen

import os
import pickle


def liste_laden(datei):          # die film-liste laden, sofern vorhanden.
    """ lade film liste aus der pickled datei """
    if os.path.exists(datei):
        with open(datei, "rb") as in_file:
            return pickle.load(in_file)
    else:
        return []

def liste_save(datei, output):   # die bearbeitete liste speichern
    with open(datei, "wb") as out_file:
        pickle.dump(output, out_file)

def film_hinzu(daten_liste):      # film titel hinzufügen
    film_titel = raw_input("\nTitel hinzufügen: ")
    daten_liste.append(film_titel)
    return daten_liste

def film_del(daten_liste, titel): # film löschen
    if titel in daten_liste:
        daten_liste = daten_liste.remove(titel)
        return daten_liste

def menu():
    """\nFilm (H)inzufügen
Film (L)öschen
(A)lle Filme anzeigen
Film (S)uchen
(B)eenden und speichern
\n"""

def main():
    datei = "filme.pkl"
    daten_liste = liste_laden(datei)

    print ("\nFilbi 2\n")
    print menu.__doc__
    auswahl = raw_input("\nAktion: ")

    if auswahl == ("H"):
        daten_liste_neu = film_hinzu(daten_liste)
    elif auswahl == ("L"):
        daten_liste_neu = film_del(daten_liste)
    elif auswahl == ("B"):
        liste_save(datei, liste_daten_neu)
        
if __name__ == '__main__':
    main()
Der Error ist allerdings happig:

Code: Alles auswählen

smodo@wunschbrunnen:~/Dokumente/pystuff/filbi2$ python filbi.py
Traceback (most recent call last):
  File "filbi.py", line 54, in <module>
    main()
  File "filbi.py", line 40, in main
    daten_liste = liste_laden(datei)
  File "filbi.py", line 12, in liste_laden
    return pickle.load(in_file)
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 880, in load_eof
    raise EOFError
EOFError
smodo@wunschbrunnen:~/Dokumente/pystuff/filbi2$ 
:)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
fon77
User
Beiträge: 17
Registriert: Freitag 10. April 2009, 20:58

Ich schätze mal Du hast eine leere Datei filme.pkl angelegt. Dein Programm sollte die Datei selbst anlegen beim Speichern...
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Warum legst du eine Funktion an, die nichts tut, und benutzt dann den Docstring, um einen String zu speichern?! Mal benutzt du `print()`, mal benutzt du `print`, der Mischmasch aus Deutsch und Englisch ist nicht schön anzusehen, entscheide dich für das eine oder das andere, `datei` ist nicht eine Datei sondern ein Dateiname, deine `ifs` vermitteln den Eindruck, dass du da Tupel vergleichen würdest, `list.remove` liefert nicht die Liste ohne das angegebene Element zurück, sondern entfernt das Element aus der Liste und wie fon77 schon angesprochen hat, ist Pickle ein binäres Dateiformat, das keine Textdateien verarbeiten kann (auch keine leeren). Und deine Funktion, mit der Listen gespeichert werden sollen, wird nur dann aufgerufen, wenn es sinnlos ist.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

SO ! ;)

Alles Funktioniert wunderbar :) Natürlich wird der Code umgeschriben und gepflegt, das menu z.b., schöner und auch korrekter. Die "Suche" Funktion muss ich noch schreiben und einfügen. Und natürlich schön weiter dran werkeln, bissl brauchbarer machen.
Die Beenden und speichern option, muss als erstes dann noch getrennt werden, kann ja nicht sein, das ich immer erst beim beenden speichern kann... Dazu, das ich nach einem Film reinschreiben, Ihn nicht gleich löschen könnte, da ich zuerst das programm beenden müsste... :)

Code: Alles auswählen

import os
import pickle
import sys


def liste_laden(datei_name):          # die film-liste laden, sofern vorhanden.
    """ lade film liste aus der pickled datei """
    if os.path.exists(datei_name):
        with open(datei_name, "rb") as in_file:
            return pickle.load(in_file)
    else:
        return []

def liste_save(datei_name, output):   # die bearbeitete liste speichern
    with open(datei_name, "wb") as out_file:
        pickle.dump(output, out_file)

def film_hinzu(film_liste):      # film titel hinzufügen
    film_titel = raw_input("\nTitel hinzufügen: ")
    film_liste.append(film_titel)
    return film_liste

def film_weg(film_liste): # film löschen
    titel = raw_input("\nWelchen Film löschen: ")
    if titel in film_liste:
        film_liste = film_liste.remove(titel)
        return film_liste

def alle_filme_anzeigen(datei_name):
    with open(datei_name, "rb") as film_liste_ausgeben:
        print pickle.load(film_liste_ausgeben)

def main():
    datei_name = "filme.pkl"
    film_liste = liste_laden(datei_name)

    while True:
        print "\nFilbi 2\n"
        print "\nFilm (H)inzufügen"
        print "Film (L)öschen"
        print "(A)lle Filme anzeigen"
        print "Film (S)uchen"
        print "(B)eenden und speichern\n"

        auswahl = raw_input("\nAktion: ")

        if auswahl == "H":
            daten_liste_neu = film_hinzu(film_liste)
        elif auswahl == "L":
            daten_liste_neu = film_weg(film_liste)
        elif auswahl == "A":
            alle_filme_anzeigen(datei_name)
        elif auswahl == "B":
            liste_save(datei_name, film_liste)
            sys.exit()
        else:
            print "(H, L, A, B) ONLY ! "
            
        
if __name__ == '__main__':
    main()
und noch eine kleine frage: wen ich nach bestimmten aktionen, wieder ein "clear-terminal-fenster" haben will, aber "os.system("clear") und subprocess.call(["clear"]) nicht verwenden sollte. Wobei ich nur bei ersterem weis wieso. Wie kann ich das problem den auf eine andere weise lösen ?
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Benutze das curses-Modul.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

danke für den tip.

und einen schönen abend noch an alle und falls man sich nicht mehr liest, frohe festtage.. :)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oder `urwid` ;-)

Zum Menü solltest Du Dir mal Dictionaries / Listen angucken und dann die Textmeldung, den/das Steuerbuchstaben/-wort und die Funktion in einem solchen Typen zusammenfassen. Damit kannst Du dann sowohl die Ausgabe, die Abfrage und die richtige Verzweigung (Dispatching) generisch implementieren. Vorteil davon ist das Einsparen langer `if-elif`-Kaskaden und die leichte Erweiterbarkeit, ohne an verschiedenen Code-Stellen etwas ändern zu müssen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

danke @hyperion :)

Und ja in urwid hab i mich schon eingelesen, basiert ja auf curses, aber einfacher zu handhaben :) urwid gefällt mir wahnsinnig gut, finde ich echt genial und wie gesagt auch "fast"sehr einfach.
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
Antworten