Daten in einem Dictionaire fest speichern

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
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Hey,
ich mache programmiere gerade ein script, bei dem es seh nützlich wär, wenn ich etwas direkt in das pythonfile schreiben könnte, damit ich nicht eine externe datei brauche. Also so ist mein Code:

Code: Alles auswählen

def beispiel(art, code):
    dic = {}
    if art not in dic.keys():
        dic[art] = code
        dic.save()
dic.save() gibt es ja natürlich nicht, aber deshalb frage ich hier, gibt es eine lib, die ermöglicht so das dic zu speichern, also dass es später im Code verändert ist oder muss ich mein script manuell verändern? Bisschen blöd zu erklären, aber ich hoffe ihr versteht es ^^

gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich glaube du willst shelve nutzen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

cofi hat geschrieben:Ich glaube du willst shelve nutzen.
Also ich denke er sucht so etwas krankes:

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import re
import json


data = {"foo": "bar"}


def save_code(data):
    with open(sys.argv[0], "r") as infile:
        code = infile.read()
    d = re.search(r"data = \{(.*?:.*?)\}", code, re.DOTALL)
    before = code[:d.start()]
    after = code[d.end():]
    new_code = "data = {0}".format(json.dumps(data))
    with open(sys.argv[0], "w") as outfile:
        outfile.write("\n".join((before, new_code, after)))


def main():
    # key-value Paare per Parameter
    data[sys.argv[1]] = sys.argv[2]
    save_code(data)


if __name__ == "__main__":
    main()
:mrgreen:

Ok, der RegExp ist so unschön... außerdem kommen bei den Iterationen immer neue Leerzeilen rein.

Naja, sma kann sich dem ja mal annehmen und den Parser für das dict verbessern!

@OP: Um Himmels weillen bloß nicht übernehmen oder ernsthaft weiterverfolgen! Das ist hier bloß ne Persiflage. Wozu willst Du denn so etwas haben? Was stört Dich an einem externen Script? Daten und Code sollte man eigentlich immer trennen, wo es nur geht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

ok hab jetzt selber was gefunden, würde es mi re.sub() machen.

Code: Alles auswählen

old = {"standard": "<a href=(.*?)>(.*?)</a>"}
print re.sub(r"SEITEN = %s"%str(old),
             'SEITEN = %s'%str(SEITEN), lines)
so funktionierts jedoch nicht

aber wenn ich es so schreibe geht es :S

Code: Alles auswählen

print re.sub(r'SEITEN = {"standard": "<a href=(.*?)>(.*?)</a>"}',
             'SEITEN = %s'%str(SEITEN), lines)
aber ich versteh nicht wieso es beim oberen nicht geht? Was muss ich ändern?

gruß
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

waki hat geschrieben: aber ich versteh nicht wieso es beim oberen nicht geht? Was muss ich ändern?
Genau die Teile, die aus dem unteren das obere machen! :-D SCNR

Noch einmal:
1.) Dein Idee ist sehr schlecht! Sich selbst modifizierender Code ist etwas, dass man nicht wirklich haben möchte.
2.) Wieso wehrst Du Dich dagegen, die Daten außerhalb in einer Datei zu speichern? (Alleine schon die Tatsache, dass es dafür zig Module in der Standard-Lib gibt, für Deine Idee aber nicht, sollte Dich stutzig machen!)
3.) Wieso suchst Du nach einer anderen Lösung als meiner :mrgreen:
4.) Sobald in den Daten des dicts geschweifte Klammern und andere für Dictionaries in frage kommenden syntaktischen Elemente vorkommen wirds ungleich schwieriger. Vermutlich endet da die Macht von RegExps, da es durchaus zu Verschachtelungen kommen könnte. Beispiel:

Code: Alles auswählen

d = {
    "foo": {
        1: "Hallo",
        2: "Welt"
    },
    "bar": 42
}
Desweiteren sehe ich bei Deinem Beispiel gar keinen Bezug zur Urpsrungsfrage. Du interessierst Dich ja anscheinend hier für die Daten innrhalb des value-Teils eines Dict-eintrags?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

1+2: Ich will einfach ein stand-alone script und momentan brauch sosnt für nichts eine extere datei und ich finde es einfach praktischer ohne.
3: Weil dein COde mit nicht ganz einleuchtet ^^
4: Ich check nicht genau was du meinst, aber bei meinem beispiel kommts nicht zu verschachtelungen.

Ich öffne die datei, lese den Quelletext aus, verändere ihn mi re.sub() und speichere ihn wieder in die datei und somit hab ich das dict im quelletext verändert.
Ach und bei deinem Beitrag check ich nicht, was das mit meienr letzten Frage zu tun hat, wie ich den code verändern müsste, damit es funktioniert?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Erkläre doch mal einfach, was Dein RegExp machen soll. Anscheinend kommt es Dir ja auf ein festes Key-Wert-Paar an!?!

Meiner ist ein ziemlich primitiver Ansatz, das syntaktische Muster eines Dicts in Python abzubilden.

Bei Dir kapiere ich den Ansatz überhaupt nicht.

Vor allem: Wo bindest Du das denn in Deinem Script ein? Du musst dazu doch den gesamten Script-Code durchsuchen... davon sehe ich bei Dir genau gar nichts.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

:D ok, mit der aussage hast du mir geholfen mein problem zu lösen :D

also: eine funktion bekommt als parameter daten, falls diese nicht im dictionair vorhanden sind, sollen sie dort aufgenommen werden und auch im quelletext in das dictionaire eingefügt werden. dazu öffne ich den quelletext nd lasse dort das alte dictionaire durch das neue ersetzten, wozu ich re.sub() verwende. danach speichere ich einfahc den ganzen quelletext wieder in die datei.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

waki hat geschrieben::D ok, mit der aussage hast du mir geholfen mein problem zu lösen :D
Na, dann poste doch mal den Code :-)

Nebenbei hast Du Dir damit imho eher Probleme geschaffen :-D (Hoffentlich machst Du auch schön Backups vom Script...)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

hmm, hab die lösung doch nicht :(
ich hab 3 backups xD
hab schonmal so ein scirpt verloren, 600 zeilen war das lang :S

Code: Alles auswählen

def analysieren(html, art="standard", code=None):
    global Proxies
    
    SEITEN = {'standard': '<a href=(.*?)>(.*?)</a>'}
    
    if art not in SEITEN.keys() and code != None:
        fobj = open("link_klicker.py", "rb")
        lines = fobj.read()
        fobj.close()
        fobj = open("link_klicker.py", "wb")
        SEITEN[art] = code
        fobj.write(re.sub(r"SEITEN = (.*?)", "SEITEN = %s"str(SEITEN), lines))
        print re.sub(r"SEITEN = (.*?)", "SEITEN = %s"str(SEITEN), lines)
        fobj.close()
jedoch editiert mein scirpt es jetzt nicht richtig, und die parameter bei re.sub() werden auch editiert...
also, bin wieder offen für alles :D
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

waki hat geschrieben:ich hab 3 backups xD
hab schonmal so ein scirpt verloren, 600 zeilen war das lang :S
Auftritt Distributed Version Control Systems

Was mir noch nicht ganz klar ist: Willst du Daten speichern? Wenn ja, warum sind `shelve` oder Datenbanken keine Loesung? Oder willst du Code speichern, veraendern und dynamisch ausführen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also erst einmal noch ein paar allgemeine Kommentare:

- global ist böse
- Proxies taucht gar nicht weiter auf - wozu steht das da also?
- der Name "link_klicker.py" suggeriert mir, dass Du da etwas mit Webseiten machst. Speziell da fallen doch tendenzielle eher viele Daten an. Wieso also nicht das ganze Problem durch pickle, shelve oder json lösen?
- SEITEN = {'standard': '<a href=(.*?)>(.*?)</a>'} Dies scheint ja das Dictionary zu sein, welches Du erweitern willst. Wozu gibt es da einen RegExp im value-Wert? Was versuchst Du da später mit zu erreichen? Ich habe den bösen Verdacht, dass Du so Links aus Webseiten parsen willst...
- Python-Scripte sind keine Binärdateien!
- Dateien öffnet man mit dem "with" Statement

zum Problem:
- Du musst Dich einfach mehr auf die Syntax eines Dictionaries einschränken. Dazu gehören sicherlich einmal die geschweiften Klammern. (wieso das insgesamt keine tolle Sache ist, habe ich ja bereits geschildert)
- Du musst irgend wie sicher stellen, dass eben nur der erste Treffer ersetzt wird - sofern die Definition innerhalb von re.sub() ebenfalls einen Treffer bieten. Daher bin ich es auch über search angegangen...

So als letzte Worte: LASS ES SEIN ;-) Konzentriere Dich ggf. erst einmal auf die Grundlagen von Python und den sinnvollen Einsatz von Modulen. Ich vermute mal da ist bei Dir noch einiges rauszuholen

@cofi: Schau Dir mein Humor-Script mal an oder führe es aus. Er will die Daten innerhalb seines Scriptes speichern - wieso eine exteren Datei für ihn nicht in Frage kommt weiß der Teufel ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:@cofi: Schau Dir mein Humor-Script mal an oder führe es aus. Er will die Daten innerhalb seines Scriptes speichern - wieso eine exteren Datei für ihn nicht in Frage kommt weiß der Teufel ;-)
Ah hmm. Bin ich der einzige, der das in Verbindung mit "ich hab schon mal ein grosses Skript verloren" für wunderbare Unterhaltung haelt? :roll:
BlackJack

@cofi: Nö, ich fand's auch humorig. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@cofi: Nö, ich fand's auch humorig. :-)
Ich auch :-) Zumal man deutlicher ja nicht warnen kann imho ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten