Seite 1 von 1
modul mit pickle-datei
Verfasst: Dienstag 1. November 2022, 14:52
von blutigeranfaenger
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!
Re: modul mit pickle-datei
Verfasst: Dienstag 1. November 2022, 15:08
von __deets__
Indem du dich relativ zum Modul dahin hangelst, mittels der __file__-Variablen. Danach mal hier im Forum suchen, und du wirst viele Beispiele finden.
Re: modul mit pickle-datei
Verfasst: Dienstag 1. November 2022, 16:09
von blutigeranfaenger
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.
Re: modul mit pickle-datei
Verfasst: Dienstag 1. November 2022, 16:25
von __deets__
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()
Re: modul mit pickle-datei
Verfasst: Dienstag 1. November 2022, 16:32
von blutigeranfaenger
Sorry, nein, das ist mir noch nicht gesagt worden, danke für den Tipp!
Re: modul mit pickle-datei
Verfasst: Samstag 5. November 2022, 11:18
von blutigeranfaenger
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?
Re: modul mit pickle-datei
Verfasst: Samstag 5. November 2022, 11:25
von __deets__
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.
Re: modul mit pickle-datei
Verfasst: Samstag 5. November 2022, 11:30
von blutigeranfaenger
Eine Klasse ist dann z.B. eine Datensammlung oder eine Konstante, wie pi oder etwas in der art?
Re: modul mit pickle-datei
Verfasst: Samstag 5. November 2022, 11:46
von __deets__
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.
Re: modul mit pickle-datei
Verfasst: Samstag 5. November 2022, 11:47
von sparrow
@blutigeranfaenger: Eine Klasse ist quasi die "Blaupause" für ein Objekt.
Such nach Objektorientierter Programmierung (OOP).
Re: modul mit pickle-datei
Verfasst: Sonntag 6. November 2022, 11:37
von blutigeranfaenger
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?
Re: modul mit pickle-datei
Verfasst: Sonntag 6. November 2022, 11:54
von __deets__
Um zu zeigen, das es geht.
Re: modul mit pickle-datei
Verfasst: Sonntag 6. November 2022, 20:08
von blutigeranfaenger
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!
Re: modul mit pickle-datei
Verfasst: Sonntag 6. November 2022, 20:33
von sparrow
Die Datei wird erstellt, wenn du sie schreibst.