Seite 1 von 1
Problem mit lokaler Variable
Verfasst: Dienstag 16. Juni 2009, 10:34
von Chivas
Hallo zusammen,
Ich bin ganz neu hier im Forum und auch ganz neu in der Python-Welt. Und ganz zufällig hat sich ein Problem aufgetan

Ich möchte eine xml-Datei auslesen und daraus ein Dictionary erstellen. Soweit so gut, aber ich bekomme schon beim Auslesen folgende Fehlermeldung:
local variable 'schiff' referenced before assignment
Code: Alles auswählen
def Schiffkosten (schiffkosten):
d={}
baum=dom.parse(schiffkosten)
for tag in baum.firstChild.childNodes:
if tag.nodeName =="schiff":
for schiff in tag.childNodes:
print schiff.nodeName
if schiff.nodeName =="id":
sid = int(_knoten_auslesen(schiff))
elif schiff.nodeName =="name":
sname = _knoten_auslesen(schiff)
elif schiff.nodeName =="kosten":
pass
Wenn ich die letzten beiden Zeilen des Codes auskommentiere, funktioniert alles bis dahin.
Hier noch einen Ausschnitt aus der xml:
Code: Alles auswählen
<struktur>
<schiff>
<id>13</id>
<name>Sonde X11</name>
<kosten>
<ressource>
<id>1</id>
<anzahl>0</anzahl>
</ressource>
...
</kosten>
</schiff>
</struktur>
Ich bin mir absolut im unklaren darüber, wo der Fehler liegt. Denn wie gesagt, würde ich die letzten beiden Zeilen auslassen, dann funktioniert alles bis dahin.
Ich hoffe ihr könnt mir da helfen.
Verfasst: Dienstag 16. Juni 2009, 10:43
von Dill
in dem code-teil den du hier gepostet hast dürfte dieser fehler nicht auftreten.
schau dir das mal an:
http://www.python.org/dev/peps/pep-0008/
kannst das gelaber am anfang überspringen, irgendwann wirds sehr substanziös.
und benutze lxml:
http://codespeak.net/lxml/
das ist viel angenehmer als dom, welches imo schande über die wundervolle py-std-lib bringt.
Verfasst: Dienstag 16. Juni 2009, 10:52
von Chivas
Dill hat geschrieben:in dem code-teil den du hier gepostet hast dürfte dieser fehler nicht auftreten
Jo, das hab ich mir auch gedacht. Aber leider tritt dieser Fehler auf. Woran kann es dann liegen? Evtl. an der Zeile davor? Glaub ich aber nicht...
Code: Alles auswählen
def _knoten_auslesen(knoten):
return knoten.firstChild.data.strip()
Dieses lxml werd ich mir mal anschauen. Danke für den Hinweis.
Verfasst: Dienstag 16. Juni 2009, 10:55
von Dill
poste mal mehr code und die ganze fehlermeldung.
wenn der code sehr lang ist pack ihn in ein pastebin, zb hier:
http://python.pastebin.com/
(das forum verkraftet lange code-blöcke nicht)
Verfasst: Dienstag 16. Juni 2009, 10:59
von Chivas
Code: Alles auswählen
import xml.dom.minidom as dom
schiffkosten = open ("schiffkosten.xml")
def _knoten_auslesen(knoten):
return knoten.firstChild.data.strip()
def Schiffkosten (schiffkosten):
d={}
baum=dom.parse(schiffkosten)
for tag in baum.firstChild.childNodes:
if tag.nodeName =="schiff":
for schiff in tag.childNodes:
print schiff.nodeName
if schiff.nodeName =="id":
sid = int(_knoten_auslesen(schiff))
elif schiff.nodeName =="name":
sname = _knoten_auslesen(schiff)
elif schiff.nodeName =="kosten":
pass
return 0
u = Schiffkosten(schiffkosten)
Traceback (most recent call last):
File "pythprob.py", line 23, in <module>
u = Schiffkosten(schiffkosten)
File "pythprob.py", line 19, in Schiffkosten
elif schiff.nodeName =="kosten":
UnboundLocalError: local variable 'schiff' referenced before assignment
Ganzer Code und ganze Fehlermeldung.
Verfasst: Dienstag 16. Juni 2009, 11:07
von Dill
das kann nicht sein.
du scheinst eine andere datei auszuführen, stelle mal sicher, dass du wirklich diesen code ausführst. pack mal ein print "ich bins wirklich" rein...
Verfasst: Dienstag 16. Juni 2009, 11:08
von Chivas
Ich bins wirklich
Traceback (most recent call last):
File "pythprob.py", line 24, in <module>
u = Schiffkosten(schiffkosten)
File "pythprob.py", line 19, in Schiffkosten
elif schiff.nodeName =="kosten":
UnboundLocalError: local variable 'schiff' referenced before assignment
Endlich verstehst du mein Problem^^
Verfasst: Dienstag 16. Juni 2009, 11:14
von Dill
dann gehört zeile 19 nicht zu dem for-block, sondern zu dem if-block vorher.
checke deine einrückung. mischst du tabs und spaces? hast du einen editor der dir whitespace anzeigen kann?
wahscheinlich sowas in der art:
Code: Alles auswählen
for tag in baum.firstChild.childNodes:
if tag.nodeName =="schiff":
for schiff in tag.childNodes:
print schiff.nodeName
if schiff.nodeName =="id":
sid = int(_knoten_auslesen(schiff))
elif schiff.nodeName =="name":
sname = _knoten_auslesen(schiff)
elif schiff.nodeName =="kosten":
pass
ist normal, dass man da in der ersten zeit mit py probleme hat.
Verfasst: Dienstag 16. Juni 2009, 11:16
von EyDu
Was passiert denn bei dem Code:
Code: Alles auswählen
def Schiffkosten (schiffkosten):
d={}
baum=dom.parse(schiffkosten)
for tag in baum.firstChild.childNodes:
name = tag.nodeName
if tag.nodeName =="schiff":
for schiff in tag.childNodes:
name = schiff.nodeName
print name
if name =="id":
sid = int(_knoten_auslesen(schiff))
elif name =="name":
sname = _knoten_auslesen(schiff)
elif name =="kosten":
pass
Edit: @Dill: hatte ich auch vermutet, aber die Einrückung sieht bis auf Zeile 12 ganz in Ordnung aus.
Verfasst: Dienstag 16. Juni 2009, 11:18
von Chivas
Boa ey, das wars wirklich. Ich hab erst mit DrPython gearbeitet. Der gefiel mir aber irgendwie nicht, also hab ich einen Einfachen Texteditor genommen. Bei dem war eingestellt, dass er Tabs mit 4 Leerzeichen ersetzen soll...
Da wär ich wahrscheinlich niemals draufgekommen...
Vielen dank für die Hilfe
Verfasst: Dienstag 16. Juni 2009, 11:42
von Dill
die probleme hat wohl jeder am anfang.
hier mal dein code mit lxml.objectify
Code: Alles auswählen
>>> from lxml import objectify
>>> f = open("schiffkosten.xml")
>>> otree = objectify.parse(f)
>>> schiffe = otree.xpath("//schiff")
>>> schiffe
[<Element schiff at 15ccf60>]
>>> for schiff in schiffe:
... print schiff.id
... print schiff.name
...
13
Sonde X11
Verfasst: Dienstag 16. Juni 2009, 12:34
von cofi
lxml ist zwar wirklich ein feines Stück Software, aber vielleicht tut es auch ElementTree in der StdLib ?