Seite 2 von 3
Re: daten auslesen und bearbeiten
Verfasst: Freitag 28. Mai 2010, 19:22
von juju
stimmt logo...
Re: daten auslesen und bearbeiten
Verfasst: Samstag 29. Mai 2010, 02:05
von juju
Code: Alles auswählen
recursive = True
xml_filenames = list()
for root, dummy, filenames in os.walk(sys.argv[1]):
for filename in filenames:
if filename[-4:].lower() == '.xml':
xml_filenames.append(os.path.join(root, filename))
if not recursive:
break
>> normaler Weise ermöglicht sys.argv[1] die Eingabe des gewünschten Pfades in der Kommandozeile... wenn ich beim Ausführen des Programms nun den gewünschten Pfad angebe, bekomme ich immer die Meldung list index out of index ... wieso füllt er die liste nicht mit meinem angegebenen Pfad ??
Re: daten auslesen und bearbeiten
Verfasst: Samstag 29. Mai 2010, 08:30
von BlackJack
@juju: Was steht denn in `sys.argv` wenn Du es mal mit ``print`` ausgibst? Wie startest Du das Programm?
Re: daten auslesen und bearbeiten
Verfasst: Samstag 29. Mai 2010, 11:45
von juju
@ blackjack: für sys.argv[0] gibt print logischerweise das aktuelle Verzeichnis des Programms aus
für sys.argv[1] gibt print: 'list out of range' aus...
das Programm starte ich über die Dos-Konsole: 'programmname'.py '+' des gewünschten Verzeichnes'
>> C:\...>programm.py C:\...
mit meinem "alten" Programm [spaghetticode] hat das eigentlich funktioniert...deswegen wundere ich mich ein wenig...
Re: daten auslesen und bearbeiten
Verfasst: Samstag 29. Mai 2010, 12:08
von BlackJack
@juju: Das sollte eigentlich auch so funktionieren. Komisch.
Re: daten auslesen und bearbeiten
Verfasst: Samstag 29. Mai 2010, 12:36
von juju
@blackjack: gibt es vielleicht eine andere möglichkeit das programm zu starten?? direkt über die python command line? gibt es da spezielle befehle??
könnte es sein das es am Betriebssystem (Windows Vista) liegt?? Der Spahetticode lief nämlich auf XP ...
Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 12:25
von juju
... tatsächlich...auf XP funktioniert es
Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 17:27
von juju
wie schaffe ich es, dass er den Wert aus
Code: Alles auswählen
R1I1o.append(doc.xpath('/Report/Table[1]/Row[2]/Cell[3]/Data/text()'))
zu int konvertiert...
int(...) funktioniert logischer Weise nicht, da es sich um Liste in Liste handelt...
ich brauche aber unbedingt int...damit ich mit den Werten rechnen kann...
Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 17:46
von Hyperion
juju hat geschrieben:
int(...) funktioniert logischer Weise nicht, da es sich um Liste in Liste handelt...
ich brauche aber unbedingt int...damit ich mit den Werten rechnen kann...
Du bemerkst selber den Widerspruch?!?
Wie sieht das ganze denn aus - ich denke niemand wird hier so viel austesten, um an den konkreten Wert Deiner Abfrage zu gelangen. Also wäre es hilfreich, diesen hier zu posten...

Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 17:57
von juju
XML:
Code: Alles auswählen
<Report>
<Abstract>
<Heading Level="4">Irgendwas</Heading>
<Table>
<Row>
<Cell>Gebaude</Cell>
<Cell>
<Data ID="Gebaude">Haus</Data>
</Cell>
</Row>
<Row>
<Cell>Benutzer:</Cell>
<Cell>
<Data ID="UserName">Juju</Data>
</Cell>
</Row>
<Row>
<Cell>Procedure Name:</Cell>
<Cell>
<Data ID="ProcedureName">Liste von Zahlen</Data>
</Cell>
</Row>
<Row>
<Cell>Procedure Status:</Cell>
<Cell>
<Data ID="ProcedureStatus">fertig</Data>
</Cell>
</Row>
<Row>
<Cell>Execution Time:</Cell>
<Cell>
<Data ID="ExecutionTime" Type="DateTime">Datum</Data>
</Cell>
</Row>
<Row>
<Cell>Expiration Time:</Cell>
<Cell>
<Data ID="ExpirationTime" Type="DateTime">Datum</Data>
</Cell>
</Row>
<Row>
<Cell>
<HyperLink>
<Url>Real.xml</Url>
<DisplayText>XML Report File</DisplayText>
</HyperLink>
</Cell>
<Cell>
<HyperLink>
<Url>Real.pdf</Url>
<DisplayText>PDF Report File</DisplayText>
</HyperLink>
</Cell>
</Row>
</Table>
</Abstract>
<Heading Level="1">Liste von Zahlen</Heading>
<Para>Der Nutzer hat etwas unterbrochen</Para>
<Table Border="true">
<Caption>Maus1</Caption>
<Row IsHeading="true">
<Cell>Nummer</Cell>
<Cell>a</Cell>
<Cell>b</Cell>
<Cell>c</Cell>
<Cell>d</Cell>
<Cell>e</Cell>
<Cell>f</Cell>
<Cell>g</Cell>
<Cell>h</Cell>
</Row>
<Row>
<Cell>1</Cell>
<Cell>
<Data>641</Data>
</Cell>
<Cell>
<Data>640</Data>
</Cell>
<Cell>
<Data>n.a.</Data>
</Cell>
<Cell>
<Data>620</Data>
</Cell>
<Cell>
<Data>3</Data>
</Cell>
<Cell>
<Data>3</Data>
</Cell>
<Cell>
<Data>n.a.</Data>
</Cell>
<Cell>
<Data>3</Data>
</Cell>
</Row>
</Table>
</Report>
Code: Alles auswählen
from lxml import etree
R1I1o=[]
doc = etree.parse('test.xml')
R1I1o.append(doc.xpath('/Report/Table[1]/Row[2]/Cell[3]/Data/text()'))
>> out: [['640']]
... daraus den datentyp integer machen, bekomme ich nicht hin...
und nein ich sehe da kein Widerspruch
Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 18:29
von Hyperion
juju hat geschrieben:
>> out: [['641']]
... daraus den datentyp integer machen, bekomme ich nicht hin...
Du willst ja auch nicht aus einer Liste einen int machen, sondern wohl aus einem Leisteneintrag! Großer Unterschied.
Geh doch die Liste durch und wandel dann die einzelnen Werte in ein int. Wenn Du weißt, dass es mindestens einen Eintrag gibt, kannst Du auch direkt per index darauf zugreifen.
und nein ich sehe da kein Widerspruch
s.o.
Re: daten auslesen und bearbeiten
Verfasst: Montag 31. Mai 2010, 18:48
von BlackJack
@juju: Du musst halt die `int()`-Funktion auf die einzelnen Elemente anwenden. `map()` ist hier sicher hilfreich.
Soll das eigentlich so verschachtelt sein? Ich hatte bisher immer angenommen dass Du am Ende eine Liste mit Werten und keine Liste mit Listen von Werten haben möchtest.
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 09:38
von juju
theoretisch ist mir das schon klar! ... nur liest mein Programm nicht nur eine XML Datei ein, sondern ca.100 ... das heißt, ich muss eine Schleife schreiben, die jeden einzelnen Wert umschreibt zu int... das ist mir bisher noch nicht geglückt... ich werde es heute weiter versuchen...
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 10:01
von Hyperion
juju hat geschrieben:theoretisch ist mir das schon klar! ... nur liest mein Programm nicht nur eine XML Datei ein, sondern ca.100 ... das heißt, ich muss eine Schleife schreiben, die jeden einzelnen Wert umschreibt zu int... das ist mir bisher noch nicht geglückt... ich werde es heute weiter versuchen...
Wie sieht denn Dein Code aus? Wenn es Dir theoretisch klar ist, verstehe ich Deine Frage nicht...
Mit map geht das ggf. auch ohne Schleife:
Code: Alles auswählen
In [1]: l = ["1", "2", "3"]
In [2]: map(int, l)
Out[2]: [1, 2, 3]
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 11:00
von BlackJack
Und bei verschachtelten Listen hilft `functools.partial()`:
Code: Alles auswählen
In [1095]: from functools import partial
In [1096]: xs = [['1', '2'], ['3', '4']]
In [1097]: map(partial(map, int), xs)
Out[1097]: [[1, 2], [3, 4]]
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 13:16
von juju
oh ...genau ...mit map habe ich es noch nicht probiert...das dürfte einiges erleichtern... ich probier es mal aus...danke schonmal...
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 14:31
von juju
die map()- und partial()- Befehle funktionieren zweifelsohne, daraus ergibt sich wieder ein weiteres Problem:
Code: Alles auswählen
R1I1o=[]
R1I1o.append(doc.xpath('/Report/Table[1]/Row[2]/Cell[3]/Data/text()'))
das Programm läuft nun alle Ordner durch und sucht nach den relevanten Werten und gibt eine verschachtelte Liste aus:
>>> [['640'],['639'],['...'],['...'],...['...']]
mit euren Befehlen macht er also ints daraus:
>>> [[640],[639],[...],[...],...[...]]
...prima so weit...
wenn ich jetzt den Mittelwert berechnen will, mit: "test = mean(R1I1o)" ...(ja das entsprechende Modul ist importiert und arbeitet einwandfrei) ... gibt er mir logischerweise ein Fehlermeldung...und ich komme nicht an die eigentliche, die innere Liste...
das Problem hängt sicher mit der Deklaration einer leeren Liste zusammen, aber wie sonst sollte ich die relevanten Werte sammeln, ohne dass das Programm daraus eine verschachtelte Liste macht??
Ich habe dann versucht, an die inner Liste über
zu kommen. Funktoniert nicht... Einzelne Elemente aus der inneren Liste bekomme ich via R1Io[x][9], wieso dann nicht auch alle bzw. wieso kann ich dort kein Intervall angeben?
viele Grüße
juju
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 14:40
von Hyperion
Am einfachsten sollte es sein, sich nicht jedes Mal eine Ein-elementige Liste zu merken, sondern an dieser Stelle bereits nur das 0.-Element zu speichern. (Dort könntest Du dann sogar ggf. direkt in einen int konvertieren).
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 15:12
von juju
dann überschreibt er doch immer den 0. Wert oder wie meinst du das??
Re: daten auslesen und bearbeiten
Verfasst: Dienstag 1. Juni 2010, 15:25
von Hyperion
juju hat geschrieben:dann überschreibt er doch immer den 0. Wert oder wie meinst du das??
Nein! Deine XPath-Query liefert Dir eine Ein-elementige Liste. Diese speicherst Du in eine andere Liste. Damit baust Du Dir ja das Problem zusammen. Anstelle diese kurze Liste zu speichern, nimm von der doch nur das eine Element.