daten auslesen und bearbeiten

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.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

stimmt logo...
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

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 ??
BlackJack

@juju: Was steht denn in `sys.argv` wenn Du es mal mit ``print`` ausgibst? Wie startest Du das Programm?
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

@ 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...
BlackJack

@juju: Das sollte eigentlich auch so funktionieren. Komisch.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

@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 ...
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

... tatsächlich...auf XP funktioniert es
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

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

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... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

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
Zuletzt geändert von juju am Montag 31. Mai 2010, 18:38, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

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

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]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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]]
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

oh ...genau ...mit map habe ich es noch nicht probiert...das dürfte einiges erleichtern... ich probier es mal aus...danke schonmal...
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

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

Code: Alles auswählen

print R1I1o[0:len(R1I1o][0]
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
Zuletzt geändert von juju am Dienstag 1. Juni 2010, 14:43, insgesamt 1-mal geändert.
Benutzeravatar
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
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

dann überschreibt er doch immer den 0. Wert oder wie meinst du das??
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten