daten auslesen und bearbeiten
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
@juju: Was steht denn in `sys.argv` wenn Du es mal mit ``print`` ausgibst? Wie startest Du das Programm?
@ 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...
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...
@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 ...
könnte es sein das es am Betriebssystem (Windows Vista) liegt?? Der Spahetticode lief nämlich auf XP ...
wie schaffe ich es, dass er den Wert aus
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...
Code: Alles auswählen
R1I1o.append(doc.xpath('/Report/Table[1]/Row[2]/Cell[3]/Data/text()'))
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...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du bemerkst selber den Widerspruch?!?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...
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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
XML:
>> out: [['640']]
... daraus den datentyp integer machen, bekomme ich nicht hin...
und nein ich sehe da kein Widerspruch
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
Zuletzt geändert von juju am Montag 31. Mai 2010, 18:38, insgesamt 1-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du willst ja auch nicht aus einer Liste einen int machen, sondern wohl aus einem Leisteneintrag! Großer Unterschied.juju hat geschrieben: >> out: [['641']]
... daraus den datentyp integer machen, bekomme ich nicht hin...
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.
s.o.und nein ich sehe da kein Widerspruch
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@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.
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.
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...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wie sieht denn Dein Code aus? Wenn es Dir theoretisch klar ist, verstehe ich Deine Frage nicht...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...
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]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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]]
die map()- und partial()- Befehle funktionieren zweifelsohne, daraus ergibt sich wieder ein weiteres Problem:
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 überzu 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
Code: Alles auswählen
R1I1o=[]
R1I1o.append(doc.xpath('/Report/Table[1]/Row[2]/Cell[3]/Data/text()'))
>>> [['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
Code: Alles auswählen
print R1I1o[0:len(R1I1o][0]
viele Grüße
juju
Zuletzt geändert von juju am Dienstag 1. Juni 2010, 14:43, insgesamt 1-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.juju hat geschrieben:dann überschreibt er doch immer den 0. Wert oder wie meinst du das??
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert