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
Dictionary aus Datei (Liste -->brauche Zahl)
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.
Ich kann zum Beispiel nicht nachvollziehen wo die Liste herkommt die du versucht "aufzurufen".
Raten macht an der Stelle wenig Sinn.
Gut, hab den Code gerade nicht zurhand, weil ich unterwegs bin, meld mich später mit Code nochmal!
Sorry
Sorry

-
- 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.
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.a 1
b 556
Jep so hab ichs gemacht. Ist das Script aus dem dem Buch 'Oop in Python'. Ich poste es später mal...
Hier mal der Code:
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.
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)
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.
Hallo ete,
Also ein
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.
Also ein
Code: Alles auswählen
try:
...
except:
pass
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.
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...
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...
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:
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.
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]:
Diese Liste kannst du nicht in ein int umwandeln.
Gut, vielen Dank für deine zahlreichen Tips!
lg
lg
