Dictionary aus Datei (Liste -->brauche Zahl)

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
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Gut, hab den Code gerade nicht zurhand, weil ich unterwegs bin, meld mich später mit Code nochmal!

Sorry :?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Jep so hab ichs gemacht. Ist das Script aus dem dem Buch 'Oop in Python'. Ich poste es später mal...
maprie
User
Beiträge: 8
Registriert: Dienstag 13. Juni 2006, 22:51

Wie wärs mit dem Standardmodul shelve? Damit kann man Dictionaries lesen und schreiben.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

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...
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Gut, vielen Dank für deine zahlreichen Tips!

lg :)
Antworten