modul mit pickle-datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Hallo ich habe eine Frage,
ich möchte ein Modul erstellen, bei dem bestimmte Daten in einer pickle-Datei hinterlegt sind und die dannvom Modul geladen werden. Wenn das Modul im python-Pfad liegt, wird dieses bei jedem Pythonaufruf leicht gefunden und kann geladen werden. Mit der pickle-Datei verhält es sich aber anders. Wie kann ich erreichen, dass diese auch immer geladen wird, ohne dass ich einen absoluten Dateipfad angeben muss?
Danke für Eure Hilfe!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du dich relativ zum Modul dahin hangelst, mittels der __file__-Variablen. Danach mal hier im Forum suchen, und du wirst viele Beispiele finden.
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Sorry,
meine suche nach __file__ oder auch "__file__" ergibt über 150000 Treffer und meistens ging es da um "file", nicht aber um die variable __file__.
Vielleicht könnt ihr mir helfen, wenn ich dieses kleine Beispiel eingebe.
Also, die Quelldatei, in der die Daten drinstehen:

Code: Alles auswählen

#!/usr/bin/env python3
import pickle
FILE = open("test.pkl","wb")
obj_1 = "Zürich Basel Genf".split()
obj_2 = "Berlin Hamburg München".split()

pickle.dump(obj_1, FILE)
pickle.dump(obj_2, FILE)

FILE.close()

Code: Alles auswählen

Das eigentliche Modul:
#!/usr/bin/env python3
import pickle
FILE = open("test.pkl","rb")
obj_1 =  pickle.load(FILE)
obj_2 =  pickle.load(FILE)
Wenn ich das modul von dem Verzeichnis aus lade, wo ich gerade bin, geht es, sonst nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist dir bestimmt schon mehrfach gesagt worden: Dateien oeffnet (und schliesst implizit) mit dem with-statement, und KONSTANTENT schreibt man gross, und auf Modulebene gehoert kein Code, sondern nur Konstanten, Funktions + Klassendeklarationen.

Code: Alles auswählen

import pathlib
import pickle

BASE = pathlib.Path(__file__).parent.absolute()
PICKLE_FILE = BASE / "test.pickle"


def load_local_pickle():
    with PICKLE_FILE.open("rb") as inf:
        return pickle.load(inf)


def write_local_pickle(data):
    with PICKLE_FILE.open("wb") as outf:
        pickle.dump(data, outf)


def main():
    write_local_pickle({"hallo": "welt"})
    print(load_local_pickle()["hallo"])


if __name__ == '__main__':
    main()
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Sorry, nein, das ist mir noch nicht gesagt worden, danke für den Tipp!
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Nur dass ich es richtig verstehe: Funktionsdeklarationen sind nicht die Definitionen der Funktion selbst, sondern so eine Art Mitteilung, dass es diese oder jene Funktion gibt, die irgendwo anders steht. Habe ich das richtig verstanden?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, das ist schon die Funktion selbst. Oder klasse. Aber die wird dann ja nur deklariert. Nicht aufgerufen. Es läuft also (relativ gesehen) kein code. Das ist das entscheidende.
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Eine Klasse ist dann z.B. eine Datensammlung oder eine Konstante, wie pi oder etwas in der art?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Klasse ist eine Klasse. Sie hat normalerweise keinen veränderlichen Zustand, wobei es da in seltenen Fällen Ausnahmen gibt. Eine *Instanz* einer Klasse ist ein Objekt, und das hat üblicherweise Zustand, und Code, der darauf operiert.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@blutigeranfaenger: Eine Klasse ist quasi die "Blaupause" für ein Objekt.
Such nach Objektorientierter Programmierung (OOP).
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Was ich noch nicht vertehe:
wozu ist der Code

Code: Alles auswählen

def main():
    write_local_pickle({"hallo": "welt"})
    print(load_local_pickle()["hallo"])

if __name__ == '__main__':
    main()
gut?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um zu zeigen, das es geht.
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Jetzt wüsste ich noch gerne folgendes:
Wenn ich die Datei, die die Pickle-Datei erzeugt lade, dann wird diese Datei jedesmal neu erzeugt, richtig?
Wenn ich auf die Variablen der Pickle-Datei zugreifen möchte, ohne dass diese jedesmal neu erzeugt wird, wie kann ich dies erreichen?
Danke für alle Tipps!
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Die Datei wird erstellt, wenn du sie schreibst.
Antworten