XML File gezielte Daten auslesen

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

naja, Du wirst schon irgend etwas verändert haben ;-)

Zu den neuerlichen Problemen:

1.) Nutze Exceptions, Speziell beim Parsen sollte man einen IOError stets abfangen (oder ab Python 2.6 mit with arbeiten ...)

2.) Kopiere Die zu Parsende Datei einmal in das selbe Verzeichnis wie Dein Script und teste erst einmal, ob der Rest klappt.

3.) Baue Pfade immer per os.join() zusammen!

4.) Teste doch mal, ob die Datei dort wirklich liegt, mit os.listdir()

So solltest Du weiter kommen!

PS: Wieso eigentlich acht Unterverzeichnisse? Ich zähle vier!
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

die Punkte 1-4 werd ich mal ausprobieren

Zum ps:

ich hab den angegebenen Dateipfad gekürzt. Im Original sind es 8 unterverzeichnisse.
also

Code: Alles auswählen

C::\Dokumente und Einstellungen\Benutzer\Desktop\Projektordner1\projektordner2\Programm\Unterprogramm\Unterordner\Roadmap\eigeneRM3.rm
So sieht die eigentliche Ordnerstruktur aus.

Hab jetzt mal die XML-Datei in den Ordner kopiert, wo das Python-Skript liegt und es kommt wieder dieser IOError.

An sich will ich ja "nur" 4 Koordinaten-Punkte aus meiner XML-Datei rausgelesen haben. Damit ich mit diesen Punkten dann weiterarbeiten kann.

Hier mal die XML-Datei

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE roadmap SYSTEM "roadmap.dtd">
<roadmap version="1.2">
	<stations>
		<station id="id0" angle="0" name="Station1">
			<point x="-7962" y="4024" />
		</station>
		<station id="id1" angle="0" name="Station2">
			<point x="4098" y="3964" />
		</station>
		<station id="id2" angle="0" name="Station3">
			<point x="4120" y="-3062" />
		</station>
		<station id="id3" angle="0" name="Station4">
			<point x="-7903" y="-2903" />
		</station>
	</stations>
</roadmap>
Und da wär nicht schlecht die ID, und die beiden Koordinaten für x und y zu bekommen.
BlackJack

War das jetzt der wirkliche Name des Ordners, oder hast Du etwas verändert? Du weisst, dass bestimmte Kombinationen von '\' + Buchstaben in literalen Zeichenketten als *ein* Byte interpretiert werden!? Zum Beispiel '\n' als Zeilenende, oder '\t' als Tabulatorzeichen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Daniela hat geschrieben: Hab jetzt mal die XML-Datei in den Ordner kopiert, wo das Python-Skript liegt und es kommt wieder dieser IOError.
Du hast natürlich die Pfadangabe entsprechend geändert?

Wieso eigentlich ignorierst Du die Lösung von BlackJack zu penetrant? Die funktioniert doch einwandfrei!

Und die Pfadangabe wird dann def. fehlerhaft sein! Eine andere Erklärung für den IO-Fehler gibt es nicht! (Davon abgesehen übernimmt das Öffnen sogar ElementTree - das open() kann man sich also sparen)

Mich beschleicht ein wenig die Annahme, dass Du nicht sauber arbeitest.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Also als ich die Datei in den gleichen Ordner kopiert hatte, hatte ich natürlich die Pfade auch geändert.

Warum ich die Lösung von BlackJack ignoriert habe???
Ganz einfach ich hab sie nicht gelesen bzw. überlesen und nicht wirklich für voll genommen.
Tut mir wirklich leid. :oops:

Aber ich hab es grad nachgeholt und wenn ich es über die Konsole aufrufe, bekomme ich keine Fehlermeldung oder ähnliches.
Das ist doch schonmal was!

Kann ich mir auch den Inhalt von result anschauen, um zu sehen, ob es der richtige ist?
Wenn ich hinter der Funktion "main()" aufrufe, werden mir (mal wieder) ein paar Fehler angezeigt.

Code: Alles auswählen

from xml.etree import ElementTree as etree

def main():
    doc = etree.parse('C:\Dokumente und Einstellungen\gast_82z\Desktop\Betoscan\betoscan\NeoPlatformControl\Platform\Roadmap\eigeneRM3.rm')
    result = list()
    for station in doc.findall('stations/station'):
        point = station.find('point')
        result.append((station.get('id'),
                      (int(point.get('x')), int(point.get('y')))))
    print result

main()
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 12, in <module>
    main()
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 4, in main
    doc = etree.parse('C:\Dokumente und Einstellungen\gast_82z\Desktop\Betoscan\betoscan\NeoPlatformControl\Platform\Roadmap\eigeneRM3.rm')
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 862, in parse
    tree.parse(source, parser)
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 579, in parse
    source = open(source, "rb")
IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\gast_82z\\Desktop\\Betoscan\x08etoscan\\NeoPlatformControl\\Platform\\Roadmap\\eigeneRM3.rm'


Ohne die Zeile 12 (dem main-aufruf) läuft es problemlos durch. Nur wie bekomme ich dann wenigstens zur Kontrolle die ausgelesenen Werte angezeigt? Und wie kann ich später mit den Werten arbeiten.


Vielen Dank schon mal für eure Hilfe und vor allem eurer Gedult.

Daniela
BlackJack

Na dann guck Dir doch bitte noch einmal *ganz genau* den Dateinamen an, der da in der Ausnahme steht! '\b' ist die Codesequenz für "backspace" und das ist ziemlich sicher nicht im Dateinamen enthalten.

Falls das bisher immer das Problem war, dann nimm das mal als Hinweis die exakten Daten und Tracebacks zu posten, und nicht irgendwelche gekürzten oder veränderten, bei denen gar keine Probleme auftreten würden. Dann müssen wir hier weniger raten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Daniela hat geschrieben:Also als ich die Datei in den gleichen Ordner kopiert hatte, hatte ich natürlich die Pfade auch geändert.
Hm ... das ist sehr seltsam!
Aber ich hab es grad nachgeholt und wenn ich es über die Konsole aufrufe, bekomme ich keine Fehlermeldung oder ähnliches.
Das ist doch schonmal was!
Bekommst Du denn auch die Ausgabe?
Kann ich mir auch den Inhalt von result anschauen, um zu sehen, ob es der richtige ist?
Der sollte ja ausgegeben werden ...
Wenn ich hinter der Funktion "main()" aufrufe, werden mir (mal wieder) ein paar Fehler angezeigt.
Was bedeutet "hinter"? Wie rufst Du es denn sonst auf?
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 12, in <module>
    main()
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 4, in main
    doc = etree.parse('C:\Dokumente und Einstellungen\gast_82z\Desktop\Betoscan\betoscan\NeoPlatformControl\Platform\Roadmap\eigeneRM3.rm')
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 862, in parse
    tree.parse(source, parser)
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 579, in parse
    source = open(source, "rb")
IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\gast_82z\\Desktop\\Betoscan\x08etoscan\\NeoPlatformControl\\Platform\\Roadmap\\eigeneRM3.rm'
Na die Meldung ist doch klar! Die Datei wird nicht gefunden - wie gehabt :-D
Ohne die Zeile 12 (dem main-aufruf) läuft es problemlos durch.
Ah ... jetzt kapiere ich: Ohne den Aufruf, wird die Funktion definiert, aber ja nie aufgerufen - so kann es zu keinem Fehler kommen ;-)
Nur wie bekomme ich dann wenigstens zur Kontrolle die ausgelesenen Werte angezeigt?
In dem Du endlich die Datei in das selbe Verzeichnis kopierst und die Dateiangabe entsprechend änderst! Danach befolgst Du meine oben genannten Vorschläge, um Dich an das eigentliche Verzeichnis heranzutasten.
Und wie kann ich später mit den Werten arbeiten.
Äh ... was meinst Du da genau? Also Du müßtest einfach das "result" per return zurückliefern und voila hast Du die Werte. Ganz einfach eigentlich!
Vielen Dank schon mal für eure Hilfe und vor allem eurer Gedult.
Geduldig sind wir hier eigentlich alle ;-)
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Hyperion hat geschrieben:
Kann ich mir auch den Inhalt von result anschauen, um zu sehen, ob es der richtige ist?
Der sollte ja ausgegeben werden ...
Wird e aber nicht. Hänge ich hinter das _print result_ noch ein _return result_ ran, wird es ganz normal compiliert ohne Fehler.
Nur wie bekomme ich dann wenigstens zur Kontrolle die ausgelesenen Werte angezeigt?
In dem Du endlich die Datei in das selbe Verzeichnis kopierst und die Dateiangabe entsprechend änderst! Danach befolgst Du meine oben genannten Vorschläge, um Dich an das eigentliche Verzeichnis heranzutasten.
Die Datei ist im selben Ordner, sowie im der Dateipfad in der Datei ist auch entsprechend angepasst.
Und wie kann ich später mit den Werten arbeiten.
Äh ... was meinst Du da genau? Also Du müßtest einfach das "result" per return zurückliefern und voila hast Du die Werte. Ganz einfach eigentlich!
So sieht der momentane Code aus: (es hat sich nicht wirklich viel verändet)

Code: Alles auswählen

from xml.etree import ElementTree as etree

def main():
    doc = etree.parse('C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\eigeneRM3.rm')
    result = list()
    for station in doc.findall('stations/station'):
        point = station.find('point')
        result.append((station.get('id'),
                      (int(point.get('x')), int(point.get('y')))))
    print result
    return result

main() #Aufruf der Funktion 
Wenn ich das Skript jetzt compiliere bzw. über die Console mit python MeanderMovement.py (irgendwann soll die Datei auch das machen, wonach sie benannt ist ;))aufrufe, kommt es zur folgenden Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 13, in <module>
    main()
  File "C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\MeanderMovement.py", line 4, in main
    doc = etree.parse('C:\Dokumente und Einstellungen\gast_82z\workspace\betoscan\src\eigeneRM3.rm')
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 862, in parse
    tree.parse(source, parser)
  File "C:\Python25\Lib\xml\etree\ElementTree.py", line 579, in parse
    source = open(source, "rb")
IOError: [Errno 2] No such file or directory: 'C:\\Dokumente und Einstellungen\\gast_82z\\workspace\x08etoscan\\src\\eigeneRM3.rm'
Und nun werd ich mir mal die oberen Vorschläge von dir genauer anschauen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hast das mit dem Kopieren und Anpassen nicht verstanden! Meine Motivation war, dass Du zum einen siehst, dass das Script so läuft und zum anderen dass Du siehst, dass das mit Deinem Pfad eben nicht stimmt! BlackJack hat Dir dazu ja auch schon was geschrieben!

Wieso hast Du nicht folgendes probiert?

Code: Alles auswählen

def main():
    doc = etree.parse('eigeneRM3.rm')
    ...
Genau darauf wollte ich hinaus!

Denk noch mal über BalckJacks Einwürfe und das "\b" nach ... und die Lösung dafür habe ich Dir oben auch schon genannt.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Hyperion hat geschrieben:Du hast das mit dem Kopieren und Anpassen nicht verstanden! Meine Motivation war, dass Du zum einen siehst, dass das Script so läuft und zum anderen dass Du siehst, dass das mit Deinem Pfad eben nicht stimmt! BlackJack hat Dir dazu ja auch schon was geschrieben!

Wieso hast Du nicht folgendes probiert?

Code: Alles auswählen

def main():
    doc = etree.parse('eigeneRM3.rm')
    ...
Genau darauf wollte ich hinaus!

Denk noch mal über BalckJacks Einwürfe und das "\b" nach ... und die Lösung dafür habe ich Dir oben auch schon genannt.
OK, ich hab meinen Fehler gefunden. Ich glaub ich hatte Tomaten auf den Augen. Der Fehler war wirklich im Dateipfad zu finden, wie BlackJack gesagt hatte. Dadurch das ein Ordner mit nem kleinen "b" angefangen hat, wurde das "\b" als Escape-Sequenz angesehen. Ist mir nur vorher nicht wirklich aufgefallen bzw. überlesen.

Naja jetzt funktioniert es ja wenigstens.


Nochmals vielen Dank an Hyperion und BlackJack, ihr habt mir wirklich sehr geholfen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Daniela hat geschrieben: Nochmals vielen Dank an Hyperion und BlackJack, ihr habt mir wirklich sehr geholfen.
Büdde :-)
Antworten