Seite 1 von 1
Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 13:11
von waki
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ß
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 13:25
von cofi
Ich glaube du willst
shelve nutzen.
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 13:48
von Hyperion
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()
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.
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 14:30
von waki
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ß
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 14:41
von Hyperion
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!

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
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:
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?
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 14:53
von waki
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?
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 15:09
von Hyperion
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.
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 15:20
von waki

ok, mit der aussage hast du mir geholfen mein problem zu lösen
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.
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 15:25
von Hyperion
waki hat geschrieben:
ok, mit der aussage hast du mir geholfen mein problem zu lösen
Na, dann poste doch mal den Code
Nebenbei hast Du Dir damit imho eher Probleme geschaffen

(Hoffentlich machst Du auch schön Backups vom Script...)
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 15:34
von waki
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

Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 16:03
von cofi
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?
Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 16:11
von Hyperion
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

Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 16:28
von cofi
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?

Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 17:20
von BlackJack
@cofi: Nö, ich fand's auch humorig.

Re: Daten in einem Dictionaire fest speichern
Verfasst: Donnerstag 12. August 2010, 17:22
von Hyperion
BlackJack hat geschrieben:@cofi: Nö, ich fand's auch humorig.

Ich auch

Zumal man deutlicher ja nicht warnen kann imho
