Seite 1 von 1

Dictionary aus Datei (Liste -->brauche Zahl)

Verfasst: Dienstag 20. November 2007, 15:14
von ete
Hallo!

Ich habe ein Dict. das so ausssieht:

d = {'a':1, 'b':556}

Ziel ist es mit dem Wert vom Key weiterzurechnen. Das klappt auch wunderbar, solange ich das Dict. im Programm habe. Sobald ich es aus einer Text Datei lade, bekomme ich eine Error Message (...List Objects are not callable...).
Die Text Datei hat folgenden Inhalt:
a 1
b 556

Mit pickle muss ichs ja erst als ne dmp Datei speichern, wäre also derselbe Tipaufwand, wie wenn ichs ins Programm miteinbinde.
Gibt es eine Möglichkeit dieses Problem einfacher zu lösen?

Liebe Grüsse
Stefanie

Verfasst: Dienstag 20. November 2007, 15:25
von Zap
Du solltest vielleicht nicht alle raten lassen sondern den Quellcode zeigen wie du denn die Daten aus der Datei einliest.
Ich kann zum Beispiel nicht nachvollziehen wo die Liste herkommt die du versucht "aufzurufen".
Raten macht an der Stelle wenig Sinn.

Re: Dictionary aus Datei (Liste -->brauche Zahl)

Verfasst: Dienstag 20. November 2007, 15:39
von keppla
Ich gebe Zap recht, denn der Fehler den du beschreibst resultiert ziemlich sicher aus einem Fehlenden Komma ("not callable" sind meist unerwartete klammern), und da lässt sich ohne sourcen nichts machen.

Verfasst: Dienstag 20. November 2007, 15:56
von ete
Gut, hab den Code gerade nicht zurhand, weil ich unterwegs bin, meld mich später mit Code nochmal!

Sorry :?

Verfasst: Dienstag 20. November 2007, 15:57
von schlangenbeschwörer
Also mit pickle kannst du nur dateien lesen, die du auch mit pickle erstellt hast, bzw. deren Inhalt.
a 1
b 556
Das hat eigentlich nichts mit pickle zu tun, du musst das also erst zu einem Dict einlesen, dh zeilenweise an der Leerstelle spliten und dann den zweiten teil als value von dict[teil1] speichern.

Verfasst: Dienstag 20. November 2007, 16:44
von ete
Jep so hab ichs gemacht. Ist das Script aus dem dem Buch 'Oop in Python'. Ich poste es später mal...

Verfasst: Mittwoch 21. November 2007, 01:50
von maprie
Wie wärs mit dem Standardmodul shelve? Damit kann man Dictionaries lesen und schreiben.

Verfasst: Mittwoch 21. November 2007, 08:48
von ete
Hier mal der Code:

Code: Alles auswählen

# units.txt
# Sekunde 5

def dict_laden(pfad):
    d={}
    try:
        datei = file(pfad) 
        liste = datei.readlines() 
        for eintrag in liste:
            l_eintrag = eintrag.split() 
            d[l_eintrag[0]] =l_eintrag[1:] 
        datei.close() 
    except:
        pass
    return d

d = dict_laden(r'C:\Dokumente und Einstellungen\Administrator\Desktop\units.txt')
value_unit1 = 55
unit1 = 'Sekunde'
if unit1 in d.keys():
    value1 = d[unit1]
    source_value = value_unit1 * value1
    print source_value, type(value1)
Nochmal zum Ziel:
Ich möchte ein Dict möglichst einfach einlesen (dh. auch einfach eintippen also nicht {'abc':1}), am Besten aus einer txt. Datei mit folgenden Inhalt:
Sekunde 5
ABC 33
DEF 0.159 usw.

Verfasst: Mittwoch 21. November 2007, 09:09
von Zap
Hallo ete,

Also ein

Code: Alles auswählen

try:
    ...
except:
    pass
sollte man schonmal garnicht machen.
Es ist schon wichtig das man gewisse Fehler explizit behandelt oder zumindest irgendwo festhalten das da was nicht gestimmt hat, wenn man es ignorieren will.

Weiter fehlt das Umwandeln in int oder float um mit dem im dict abgespeicherten Wert rechnen zu können.

Wo der oben beschriebene Fehler mit dem call der List herkommt kann ich leider gerade nicht sagen. Vielleicht erstmal den try-block wieder scharf schalten, dann könnte sich so einiges von alleine klären.

Verfasst: Mittwoch 21. November 2007, 09:21
von ete
call list habe ich gelöst...

Wenn ich d[unit1] in int umwandeln will (oder int(l_eintrag[1:])), bekomme ich TypeError: int() argument must be a string or a number, not 'list'. Auch wenn ich try-except wegglasse...
Das ist mein Problem...

Verfasst: Mittwoch 21. November 2007, 09:30
von Zap
Entweder mit nem debugger dort mal anhalten oder l_eintrag printen.
Das ist auch eine sehr wichtige vorgehensweise wenn man einen Fehler finden will ein paar printausgaben einzubauen und zu gucken ob das was man da sieht auch dem entspricht was man erwartet.

Ich würde erwarten das:

Code: Alles auswählen

In [1]: # eintrag ist ein String

In [2]: eintrag = "a 556"

In [3]: l_eintrag = eintrag.split()

In [4]: # nun sind a und 556 voneinander getrennt

In [5]: l_eintrag
Out[5]: ['a', '556']

In [6]: l_eintrag[0]
Out[6]: 'a'

In [7]: l_eintrag[1]
Out[7]: '556'

In [8]: int(l_eintrag[1] )
Out[8]: 556

In [9]:

Wenn du natürlich einen String hast aus dem beim split nicht 2 Elemente zurückkommen sondern mehr erhälst du per [1:] auch eine Liste. (Was ich vorhin in der eile übersehen hab, dass du sogar immer ein Liste erhälst).
Diese Liste kannst du nicht in ein int umwandeln.

Verfasst: Mittwoch 21. November 2007, 11:53
von ete
Gut, vielen Dank für deine zahlreichen Tips!

lg :)