Was meinst Du mit Schema? Ein Konzept für Dein Film-DB-Projekt oder für das Datenformat, welches Du persistent ablegen willst?smodo hat geschrieben: werde es nach deinem schema machen, was übersichtlicher ist und auch sehr logisch aufgebaut...
Erstellen einer Filmdatenbank
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
so, habs neu geschrieben, bin aber noch nicht ganz fertig, in der main fehlen noch verzweigungen.
Der Error ist allerdings happig:

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()
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.
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.
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...
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 ?

Alles Funktioniert wunderbar

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()
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
- 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.

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
assert encoding_kapiert
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.

Und ja in urwid hab i mich schon eingelesen, basiert ja auf curses, aber einfacher zu handhaben

Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.