Erstellen einer Filmdatenbank

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

Dienstag 13. September 2011, 10:43

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:

Dienstag 13. September 2011, 10:52

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

Dienstag 13. September 2011, 11:32

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

Mittwoch 21. Dezember 2011, 10:23

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

Mittwoch 21. Dezember 2011, 11:11

@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

Mittwoch 21. Dezember 2011, 11:41

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

Mittwoch 21. Dezember 2011, 12:02

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

Mittwoch 21. Dezember 2011, 12:36

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

Mittwoch 21. Dezember 2011, 12:39

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

Mittwoch 21. Dezember 2011, 13:12

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

Mittwoch 21. Dezember 2011, 13:37

@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

Mittwoch 21. Dezember 2011, 13:42

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

Mittwoch 21. Dezember 2011, 13: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

Mittwoch 21. Dezember 2011, 13:46

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:

Mittwoch 21. Dezember 2011, 13:48

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
Antworten