Seite 2 von 3

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 11:41
von smodo
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 ?

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 12:02
von nomnom
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.

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 12:36
von smodo
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 :)

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 12:39
von nomnom
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 …

Re: Erstellen einer Filmdatenbank

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

Re: Erstellen einer Filmdatenbank

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

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 13:42
von Rekrul
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.).

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 13:45
von smodo
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 ;)

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 13:46
von smodo
und @BlackJack, danke, jetzt hats klick gemacht :)

Re: Erstellen einer Filmdatenbank

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

Re: Erstellen einer Filmdatenbank

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

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 14:01
von BlackJack
@smodo: Dann steht in der Datei etwas mit dem `pickle` nicht klar kommt.

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 14:06
von smodo
jo und das ist irgendwo ein "\n" so wie es aussieht. :)

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 14:33
von Rekrul
@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.

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 14:50
von smodo
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 :)

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 14:56
von Hyperion
smodo hat geschrieben: 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" ... :)
Hu? Dann benutzt Du `pickle` sicherlich falsch!
smodo hat geschrieben: 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 :)
Ich kann verstehen, dass man nicht `pickle` nutzen will, aber wieso willst Du ein eigene Textformat nutzen? Oder verwendest Du jetzt einen (anderen) Standard?

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 15:03
von smodo
hmm irgendiwe denke ich es zu einfach...
funktioniert nicht ganz... :) Es gibt an den Film nicht zu finden, löscht aber alles und überschreibt mir die datei :)

Code: Alles auswählen

def film_del(titel):
    datei = open("filme.txt", "a+") 
    make_in = []
    for element in datei:
        make_in.append(element)
        if titel in make_in:
            del make_in[title]
            datei.write(make_in)
            datei.close()
        else:
            print "Nicht vorhanden. "
            datei.close()
hmm nein nein pickel ist ja schon gut und recht, das sicherlich, aber ich habs nach vorgabe genutzt und es kammen immer KeyError entweder "\n" oder "A" und sonstiges.

Edit, so ist es aktuell, geht aber immer noch nicht, ich glaub ich schmeiss mein pc gleich zum fenster raus ;)

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 15:12
von Rekrul
smodo hat geschrieben:nene die war total leer, nur filme = [], stand drinnen.
Du kannst nicht einfach 'filme = []' in diese Datei schreiben.

Vielleicht solltest du mal folgendes versuchen. Beim starten deines Scriptes alle abgespeicherten Filme laden:

Code: Alles auswählen

import os
import pickle

def load_movie_data(filename):
    """
    Load a movie-list from a pickled file.
    """
    if os.path.exists(filename):
        #wenn die Datei existiert, dann Filmliste aus Datei laden
        with open(filename, 'rb') as pickle_file:
            return pickle.load(pickle_file)
    else:
        #wenn die Datei nicht existiert, dann leere Liste
        return []
Erst beim verlassen des Scriptes die Filmliste wieder abspeichern:

Code: Alles auswählen

def save_movie_data(filename, movie_list):
    """
    Pickle a movie-list.
    """
    with open(filename, 'wb') as output:
        pickle.dump(movie_list, output)
Dein Gerüst könnte dann in etwa so aussehen:

Code: Alles auswählen

filename = 'movies.pkl'
movie_data = load_movie_data(filename)
modified_movie_data = do_something(movie_data)
save_movie_data(filename, modified_movie_data)
EDIT: Öffne Dateien mit 'with'!

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 15:14
von Hyperion
Das kann nicht funzen! Schau Dir mal Deine Datei an... da steht sicherlich nicht das drin, was Du vorher drin stehen hattest.

Nebenbei öffnet man Dateien so:

Code: Alles auswählen

with open() as handler:
    # handler ist hier file-Object
Damit ist sicher gestellt, dass die Datei immer geschlossen wird.

Re: Erstellen einer Filmdatenbank

Verfasst: Mittwoch 21. Dezember 2011, 15:17
von smodo
hey cool, danke, aber muss ehrlich sein, ich habe mein scheiss dingens komplet gelöscht, bin da irgendwie falsch ran, werde es nach deinem schema machen, was übersichtlicher ist und auch sehr logisch aufgebaut...

War meins zwar auch, also alle funktionen zusammen und ein Gerüst aber anscheinend hatte ich viel zu viel unnötiger text... ;)

with open() as blabla:
ist gemerkt und notiert. !