Dictionaries 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.
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Mittwoch 19. Dezember 2007, 15:36

Hallo allerseits
Ich bin neu hier und habe eine frage zu meinem ersten script:

Code: Alles auswählen

def viewlist():
    print mylist

def Addtolist():
    print "Which name would you like to add?"
    name = raw_input("> ")
    print "What do you want to assign to", name + "?"
    value = raw_input("> ")
    print "OK.", name, "with the value", value, "has been added."
    mylist[name] = value

def Delfromlist():
    print "Which name do you want to delete?"
    delname = raw_input("> ")
    del mylist[delname]
    print "OK.", delname, "has been removed from the list."

def loadfile():
    print "Please enter the name of the file"
    namefile = raw_input("> ")
    namefile = namefile + ".txt"
    fopen = open(namefile)
    readdata = fopen.read()
    fopen.close()
    print readdata
    print
    print "Do you want to save the read data?"
    print "1. Yes"
    print "2. No"
    print
    commandread = raw_input("> ")
    if commandread == "1":
        print "What's the name of the data?"
        datadefname = raw_input("> ")
        datadefname = readdata

def savefile():
    print "Please enter a name for your list."
    listdefname = raw_input("> ")
    listdefname = listdefname + ".txt"
    print "WARNING!!! The file, if already exists, will be overwritten COMPLETELY!"
    print
    print "1. Overwrite"
    print "2. Append"
    print "Write 'exit' to exit writing"
    commandnow = raw_input("> ")
#########################PROBLEM IS HERE#########################
    if commandnow == "1":
        f = file(listdefname, "w")
        f.write(mylist)
        f.close()
    elif commandnow == "2":
        f.append(mylist)
        f. close()
#################################################################
    elif commandnow != "exit" and commandnow != "1" and commandnow != "2":
        print "Sorry, unkown command!"
        f.close

print
print "List@Generator v0.1 Copyright by Kaan D. Ocal"
print
print "---------------------------------------------"

command = 0
mylist = {}

while command != "quit":
    
    print
    print "Please choose an action"
    print
    print " 1. Look at your list"
    print " 2. Add a name to your list"
    print " 3. Remove a name from your list"
    print " 4. Load a list"
    print " 5. Save your list"
    print
    print "Write 'quit' to quit"
    print
    
    command = raw_input("> ")
    
    if command != "1" and command != "2" and command != "3" \
    and command != "4" and command != "5" and command != "quit":
        print
        print "Sorry, invalid command"
    
    elif command == "1":
        viewlist()
        
    elif command == "2":
        Addtolist()
        
    elif command == "3":
        Delfromlist()
        
    elif command == "4":
        loadfile()
        
    elif command == "5":
        savefile()
       
Ich würde gerne wissen wie ich diese Dictionaries speichern könnte und wie der Benutzer selbst aussuchen kann, welches Dictionary er ansehen kann. z.b.

Code: Alles auswählen

...
    print "Which Dictionary do you want to look at?"
    chosendict = raw_input("> ")
    print chosendict
...
Das würde ja nur die eingabe anzeigen... Nicht das Dict.
Ich würde mich freuen, wenn jemand mir helfen könnte.
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Mittwoch 19. Dezember 2007, 15:50

zum speichern würde ich mir an deiner stelle mal pickle ansehen.

und auswählen, welches dictionary er ansehen möchte, würde ich eine kleine funktion machen. entweder ganz einfach mit glob, oder etwas schöner, vor allem wenn es mehrere ordner mit einbeziehen soll, das walk bzw. os.walk modul
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Mittwoch 19. Dezember 2007, 16:25

Danke, das pickle war super! Es geht jetzt! :lol:
Nur den zweiten Teil habe ich nicht verstanden. :(

PS: Ein GUI Tut wäre auch net schlecht!!! Danke im voraus! :lol:
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. Dezember 2007, 16:34

Hallo Brafil, willkommen im Forum,

Du musst einfach mit ``rawdata = file(chosendict, 'r'); print pickle.load(rawdata)`` die Datei öffnen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Mittwoch 19. Dezember 2007, 16:45

Ja, da war ich wohl zu ungenau... 8)
Das "pickln" habe ich ganz verstanden, aber nicht wie man die namen der listen manuell verändern kann... z.b.

Code: Alles auswählen

...
print "Which Dictionary do you want to look at?"
chosendict = raw_input("> ")
undsoweiter
Endeffekt: Python zeigt das Dict mit dem namen chosendict an
...
oder

Code: Alles auswählen

...
print "What will be the name of the list?"
nameofthelist = raw_input("> ")
undsoweiter
Endeffekt: mylist wurde in nameofthelist umgewandelt
Wie kann man in beiden fällen den Endeffekt erzielen?
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 19. Dezember 2007, 16:47

Leonidas hat geschrieben:Hallo Brafil, willkommen im Forum,

Du musst einfach mit ``rawdata = file(chosendict, 'r'); print pickle.load(rawdata)`` die Datei öffnen.
Für pickle sollte man sich übrigens gleich die Modi "rb" bzw. "wb" angewöhnen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. Dezember 2007, 17:41

birkenfeld hat geschrieben:Für pickle sollte man sich übrigens gleich die Modi "rb" bzw. "wb" angewöhnen.
Ups, ja, habe ich gerade übersehen.

Brafil, nachdem du das dict entpickelt hast, reicht doch einfach ein print.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Mittwoch 19. Dezember 2007, 18:28

Brafil hat geschrieben: Das "pickle" habe ich ganz verstanden, aber nicht wie man die namen der listen manuell verändern kann... z.b.

Code: Alles auswählen

...
print "Which Dictionary do you want to look at?"
chosendict = raw_input("> ")
undsoweiter
Endeffekt: Python zeigt das Dict mit dem namen chosendict an
...
oder

Code: Alles auswählen

...
print "What will be the name of the list?"
nameofthelist = raw_input("> ")
undsoweiter
Endeffekt: mylist wurde in nameofthelist umgewandelt
Wie kann man in beiden fällen den Endeffekt erzielen?
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Donnerstag 20. Dezember 2007, 14:21

I added a simple GUI.
Im gonna add a menu and fix this "Look at the list" issue. Currently it's showing the list in a Pop-Up window.

Here some screenshots:

http://img2.freeimagehosting.net/image. ... d07264.jpg
http://img2.freeimagehosting.net/image. ... e21bda.jpg
http://img2.freeimagehosting.net/image. ... 2656ee.jpg
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Donnerstag 20. Dezember 2007, 14:52

Ich hab das Menü gemacht. Ich frage mich wie ich daraus etwas wie ein Runtime machen kann

PS: Sorry for speaking english in my last post, it was out forsee (aus versehen) :wink:
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Freitag 21. Dezember 2007, 05:24

Hallo,

also ich bin mir absolut nicht sicher, ob ich verstanden habe, was du eigentlich moechtest, aber wenn du mehrere Dictionarys in einer Datei und auf ein bestimmtes (eben das der Nutzer eingab) zugreifen willst, dann packe sie doch einfach wieder in ein Dictionary...

Code: Alles auswählen

listen = dict()
listen["namen"] = dict(("ralfi", "cool"), ("horsti", "nicht so cool"))
listen["autos"] = dict(("mercedes", "teuer"), ("audi", "teuer, aber schoen"), ("trabant", "kult"))
# [...]
whichone = raw_input("Welche Liste willst du? ")
if listen.has_key(whichone):
    print listen[whichone]
else:
    print "hab ich nich..."
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Freitag 21. Dezember 2007, 10:27

Gute lösung, aber bei Addtolist geht das nicht:

Code: Alles auswählen

def addtolist():
    listname = inputname.get()
    listvalue = inputvalue.get()
    whichlist = askstring("Choose List", "To which list do you want to add this name?")
    mylists[whichlist[listname] = listvalue]
...
PS: Ich glaube, das manuelle auswählen der liste ist nicht mehr notwendig, da ich ein GUI und speichermöglichkeit hinzugefügt habe:
Hier das Programm, alle Vorschläge verbessern es:

Click Here
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 21. Dezember 2007, 11:11

Hallo Brafil!

Vielleicht bringt es dir etwas, wenn du mehr über die Möglichkeiten erfährst, mit denen man etwas unter Python speichern kann.

http://www.python-forum.de/topic-6157.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Freitag 21. Dezember 2007, 12:03

@Brafil: Sternchenimporte sollte man vermeiden, weil man sich damit viele Namen in den Namensraum holt, die miteinander kollidieren können und man weiss bei vielen solchen Importen im Quelltext dann nicht mehr woher eigentlich welcher Name kommt.

Die meisten Leute schreiben die ``import``-Anweisungen am Anfang des Moduls. Manchmal macht es Sinn sehr "teure" und selten benutze Importe in Funktionen zu schreiben, aber dort etwas zu importieren was am Anfang im Modul sowieso schon importiert wurde, macht keinen Sinn. Insbesondere steigt hier bei einem Sternchenimport auch noch die Gefahr, dass dabei ein Name von der Modulebene durch etwas Importiertes verdeckt wird.

``global`` auf Modulebene hat keinen Effekt und in Funktionen sollte man es nicht benutzen. Globale Namen für Daten machen Programme schwerer verständlich und fehleranfälliger.

Ein Dictionary `mylist` zu nennen ist irreführend. Gilt auch für die anderen Namen die ein `list` in sich tragen, aber mit einem Dictionary arbeiten.

Pickle-Dateien sollte man immer im Binärmodus öffnen, da es sich um Binärdateien handelt. Auch bei dem "Text"-Format. Das ist im Grunde ein Binärformat, bei dem die Bytewerte im ASCII-Bereich bleiben. Wenn man das nicht tut, sind die Daten unter Umständen nicht unter verschiedenen Plattformen austauschbar. Die Dateinamenserweiterung '*.txt' ist deshalb auch etwas ungünstig.

``except`` sollte man nie ohne konkrete Ausnahme verwenden. So werden einfach *alle* Ausnahmen behandelt. Wenn man sich bei einem Namen vertippt, wird zum Beispiel auch der daraus folgende `NameError` einfach in eine nichts sagende Fehlermeldung umgewandelt. Solche Fehler können dann sehr schwer zu finden sein. Ein schönes Beispiel ist `savefile()` wo man in *jedem Fall* ein Fenster mit dem Text "Couldn't save file" bekommt, weil `asksavefilename` einen `NameError` auslöst.

Die Elemente selber auf einem `Canvas` zu platzieren ist ungewöhnlich bis schlecht. Das Layout sollte man einem Layout-Manager überlassen, statt selber Koordinaten fest zu legen, die bei einer anderen Bildschirmauflösung und/oder anderer Schriftgrösse nicht mehr Stimmen. Bei mir ragen die `Entry`\s zum Beispiel ein klein wenig in die `Button`\s hinein.

`Button`\s einfach nur als Textanzeige zu missbrauchen ist auch nicht schön. Da hätte es auch ein `Label` getan.

Die "Tab"-Reihenfolge beim Eintragen ist subobtimal. Vom Schlüssel zum Wert kommt man per Tab-Taste, aber danach geht's dann nicht gleich zum "OK"-Button weiter.
Brafil
User
Beiträge: 40
Registriert: Montag 17. Dezember 2007, 17:51
Wohnort: Istanbul

Freitag 21. Dezember 2007, 12:26

Danke für die Hilfe.
(Manchmal muss ich widersprechen)

1. Die sternchenimporte hab ich absichtlich gemacht, und dafür gesorgt dass nix kollidiert. (Außer Pickle)

2. Die module brauche ich oft für mehrere codes des Programms

3. Global ist auch extra, weil ein einziges dict verwendet wird. sonst fügt man einen namen hinzu, dann ist die liste immer noch leer.

4. mylist habe ich ganz am anfang geschrieben, deshalb sollte es so bleiben, hab keine lust den quellcode nach mylist zu durchsuchen, (auch mit Find nicht), in der neuen version an der ich arbeite ist es zu schwer. Außerdem finde ich das in dem fall passender. Aber wenns so dringend ist...

5. Wie speichert man im Binärmodus?

6. Warum gibt es da immer eine fehlermeldung? Hab ich grade jetzt bemerkt. Deshalb habe ich da try...except weggelassen, aber jetzt printet es die fehlermeldung...

7. Ja, ich weiß. Was für ein Layout manager wäre da am besten?

8. Ja, weiß ich auch, aber solange ich das textfenster wo das programm mylist (bzw. mydict) ausgibt, geht es nur so.

9. Werde ich auch machen. nervt mich auch.

PS: mylist ist jetzt mydict
[b][color=blue]Python[/color] + [color=orange]Blender[/color][/b] = [i]Super[/i]

[i]"Le Python mangera Tout"[/i]

The Python is gonna eat everything

(Except for Java, there are too many fans)
Antworten