Erstellen einer Filmdatenbank

Code-Stücke können hier veröffentlicht werden.
deets

Das kannst du nicht verhindern, du musst dann den String entsprechend praeparieren. Mit "'foo\n'.strip()" sollte das gehen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

deets hat geschrieben:Das kannst du nicht verhindern, du musst dann den String entsprechend praeparieren. Mit "'foo\n'.strip()" sollte das gehen.
Laut Doku sollte das aber nicht passieren: Link. Oder entfernt Python sogar das "\n" und übersieht nur das "\r", welches iirc unter Windows zusätzlich das Zeilenende markiert? Wenn ja würde ich das ja für einen Bug bzw. ein nicht durchdachtes Verhalten halten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
gofid
User
Beiträge: 13
Registriert: Sonntag 11. September 2011, 12:26

Hyperion hat geschrieben:[...]Wenn ja würde ich das ja für einen Bug bzw. ein nicht durchdachtes Verhalten halten.
Na toll, da stosse ich gleich am Anfang auf solche Probleme... ich Glückspilz :D Danke dir nochmal, ohne deinen Tipp mit dem repr() hätte ich da vemutlich noch einige Stunden investiert...

Ist übrigens beide male Version 3.2 bei meinen Rechnern. Beim Windows 7 Rechner ist allerdings eine 64bit Version installiert.

@deets
Danke für den Tipp mit dem strip(), das hat geklappt. Ich muss mir mal eine Liste mit den ganzen BIF's auf meinen Arm tätowieren. Denn eigentlich kannte ich strip() ja schon. :oops:
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

Ich hab mir natürlich zum üben auch eine kleine datenbank erstell, es funktioniert auch alles, eig. :)
Es werden alle Film-Titel in einer .txt gespeichert. nur die funktion um film-titel zu löschen geht nicht.

Die sieht folgendermasen aus:

http://paste.pocoo.org/show/523917/

Ich kann filme suchen, filme hinzufügen, alle filme anzeigen lassen, nur löschen kann ich keinen. Es kommt immer "Film nicht vorhanden"... Liegt der fehler in der funktion ?
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
BlackJack

@smodo: Ja der Fehler liegt in der Funktion. Das geht so sowieso so nicht. Dateien haben keine `remove()`-Methode — man kann aus Textdateien nicht einfach mitten drin eine Zeile löschen.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

ok, danke, wie kann ich den bestimmt wörter in einer .txt datei löschen ?
finde da irgendwie nix dazu. nur wie man rein schreibt, oder sie sonst bearbeitet, nur wie man elemente in einer .txt datei löscht find ich nirgends was dazu.

Oder sollte ich die FIlme in einer Liste[] in einer .py datei spreichern ?
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Wenn du schon Python-Objekte speichern willst, solltest du Pickle o. ä. benutzen.
  • Du schließt die Datei nicht, falls der Titel nicht in der Datei gefunden werden sollte.
  • Der Titel kann in der Datei gar nicht gefunden werden, da alle Zeilen mit einem \n enden, und du deswegen ein Newline-Zeichen an den Titel anhängen müsstest, damit es so funktioniert wie du es willst.
  • Wenn du eine Datei bearbeiten willst, musst du entweder den Modus „a“ benutzen, damit du Zeilen anhängen kannst, oder den Modus „w“ benutzen, mit dem du allerdings die ganze Datei neu schreiben musst.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

hey cool, danke für den tipp mit pickle, gerade bissl eingelesen und ich finds echt praktisch.
Nur finde ich auch hier z.b. Galileo Crap-Book, oder Wikibook nichts zum elemente entfernen mit pickel, aber erst ma weiter suchen, gibt ja nicht nur Galileo "was eh nicht die beste wahl ist" und das wikibook.

Und erstmal mit pickel meine datenbank umschreiben :)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

smodo hat geschrieben:hey cool, danke für den tipp mit pickle, gerade bissl eingelesen und ich finds echt praktisch.
Nur finde ich auch hier z.b. Galileo Crap-Book, oder Wikibook nichts zum elemente entfernen mit pickel, aber erst ma weiter suchen, gibt ja nicht nur Galileo "was eh nicht die beste wahl ist" und das wikibook.

Und erstmal mit pickel meine datenbank umschreiben :)
Du liest deine Pickle-Datei ein (in der du eine Liste speicherst), löschst den Filmtitel aus der Liste, und schreibst deine Liste wieder in die Datei …
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

also, langsam komm ich nicht mehr nach, bin halt auch noch neuling... :)

Ich habe eine filme.pkl datei, in der steht nur:
filme = []

die funktion um filme hinzfügen:

Code: Alles auswählen

def film_hinzu(titel):
    output = open("filme.pkl", "a")
    pickle.dump(titel, output)
    output.close()
ich weiss nicht wie ich direkt in die liste der .pkl datei direkt was zufügen kann, logischerweise steht am schluss in der filme.pkl:

Code: Alles auswählen

filme = []
S'Batman'
p0
.
also ich weiss schon liste.append() und so, nur halt wie mit pickle und der datei verbinden nicht.
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
BlackJack

@smodo: Das ``filme = []`` hat in der Datei nichts zu suchen, damit kann `pickle` nichts anfangen. Vergiss einfach mal das Du an den Dateien etwas ändern kannst. Das vorgehen ist: Einlesen, Datenstruktur verändern, Datei neu schreiben. Bei der Datei nichts anhängen, löschen, oder verändern wollen.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Ich denke du musst die Datei erst auslesen, dann deinen Datensatz anhängen und anschließend wieder speichern.

Code: Alles auswählen

def film_hinzu(title):
    with open('data.pkl', 'rb') as pickle_file:
        movie_list = pickle.load(pkl_file)
    movie_list.append(title)
    with open('data.pkl', 'wb') as output:
        pickle.dump(movie_list, output)
Evtl. kannst du dir mal shelve anschauen. Das entspricht vielleicht eher deinen Vorstellungen. Allerdings macht das auch nur dann Sinn, wenn du zu dem Filmtitel weitere Attribute abspeichern möchtest (Genre, Schauspieler, Jahr etc.).
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

das ist aber eine sehr gute idde, mit genre und co. :) jo ich melde mich morgen nochmal, anscheinend gibt es viel zu lesen noch :)

Hat jetzt gute ansätze, so dann ma ran an die arbeit ;)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

und @BlackJack, danke, jetzt hats klick gemacht :)
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:

Und was kann `shelve`, was pickle nicht kann? Letztlich kann man dann auch noch `json` in den Raum werfen - dann macht man sich von Python unabhängig.

Wichtig ist das doch erst einmal das generelle Verständnis, dass man Daten nur im Speicher manipuliert und nicht direkt an der Quelle der Persistenz. Genau dafür gibt es ja solche Persistenz-Module.
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

habs grad mal mit:

Code: Alles auswählen

def film_hinzu(titel):
    with open("filme.pkl", "rb") as pkl_file:
        movie_list = pickle.load(pkl_file)
    movie_list.append(titel)
    with open("filme.pkl", "wb") as output:
        pickle.dump(movie_list, output)
probiert.

Code: Alles auswählen

Film Hinzufügen: Batman
Traceback (most recent call last):
  File "filbi.py", line 84, in <module>
    main() 
  File "filbi.py", line 69, in main
    film_hinzu(titel)
  File "filbi.py", line 12, in film_hinzu
    movie_list = pickle.load(pkl_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)
KeyError: '\n'

und ja ich habs jetzt verstanden, ich kann an der quelle nicht rumpfuschen, ich kann nur eine "kopie" machen, die bearbeiten und dann neu in die quelle einfügen.
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
BlackJack

@smodo: Dann steht in der Datei etwas mit dem `pickle` nicht klar kommt.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

jo und das ist irgendwo ein "\n" so wie es aussieht. :)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

@Hyperion
Hyperion hat geschrieben:Und was kann `shelve`, was pickle nicht kann?
Da shelve auf pickle aufbaut, behaupte ich einfach mal: es kann nicht mehr.
Es vereinfacht die 'Persitenzhaltung' für dictionaries. Daher auch der Hinweis mit weiteren Attributen.

@smodo
Kann es sein das du in die *.pkl Datei noch das von vorher stehen hast?

Code: Alles auswählen

filme = []
S'Batman'
p0
.
Entferne am besten die Datei. Wenn du dein Script startest und die Datei noch nicht existiert, dann musst du sie eben erstellen. Entweder gleich beim Start oder erst bei Bedarf.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

nene die war total leer, nur filme = [], stand drinnen.

Aber ich machs jetzt mit einer .txt wieder und ohne pickle, es gab mit zu strange fehler aus, wo ich evtl, alles nochmal schreiben muss und sorry das wäre zuviel.... von wegen KeyError "\n" ... :) Ich mache jetzt einfach die funktion so, das sie den inhalt der .txt in eine liste packt und nachher bestimmte elemente lösche und dann mit der aktuellen liste, die datei überschreiben... fertig :)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
Antworten