Wie Text aus einer Datei mit Python 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.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 16:27

also ein string.
hmm.

bringt mich noch nicht weiter, denn ich muss irgendwie beim einlesen der daten schon dafür sorgen, dass er jeden gefundenen eintrag als objekt an einen eigenen namen weiterreicht.
nur wie weiss ich noch nicht.

es heisst ja bei findall() : "Returns a list or iterator containing all matching elements, in document order."

also müsste ich hier was ändern, damit er eine richtige liste erzeugt.
aber er erzeugt ja automatisch die name.text, wenn ich das richtig verstehe und darin ist nur der letzte gefundene eintrag gespeichert, weil vermutlich alle vorher gefundenen überschrieben wurden.

Code: Alles auswählen

        for actor in tree.findall('//actor'):
                for name in actor.findall('name'):
                        print '%s: %s' % (name.tag.capitalize(), name.text)


aber ich sehe hier garnicht, dass eigentlich ein "name.text" erzeugt wurde. das wird also wohl im modul intern so gesetzt? kann ich dann unter verwendung dieses moduls überhaupt mein ziel erreichen?
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 16:39

sorry, ihr sagt immer "lies das tutorial", aber dann gehe ich im tutorial mal die grundbegriffe durch. schön. wo steht nun, dass name.text erzeugt wurde?

ich bin elementtree docs durchgegangen und konnte jetzt nur rausfinden, dass es mir den ersten oder alle einträge finden kann.
ja, schön, aber ich will nicht nur den ersten, sondern alle. aber wenn es alle findet, dann überschreibt es auch alle miteinander.

da muss es ja also einen kniff geben, wie man ihm sagt, er soll eben jedes einzeln speichern.

also hab ich mal bei den iterators geschaut. dort gibt es ja next(). aber das krieg ich irgendwie nicht in die drei zeilen rein. kommt nix bei raus.

das tutorial ist also toll, wenn man eine funktion eines moduls nachschauen will, aber nun weiss ich ja schon, welche funktion ich benutzen will, nur find ich einfach nicht, wie ich dafür sorge, dass dessen output auch in einer für mich brauchbaren form erscheint.

frustrierend :cry:

mir ist klar, dass ihr denkt, ich bin nur zu faul. vielleicht auch zu blöd.
aber ich bin hier echt fleissig am schreiben und lesen und habe ja die meisten sachen auch alleine hingekriegt (den rest des programms meine ich damit).
aber jetzt kann ich zwar mit hilfe des etree alles auslesen, was ich will, denn die syntax hab ich nun glaube ich verstanden, aber der output ist nicht zu gebrauchen.
:evil:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 21. April 2009, 17:09

Was genau liefert Dir dieser Code als Ausgabe?

Code: Alles auswählen

        for actor in tree.findall('//actor'):
                for name in actor.findall('name'):
                        print '%s: %s' % (name.tag.capitalize(), name.text)


Und dann beschreib doch noch mal bitte, was Dich daran stört bzw. was Du haben willst.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 17:27

Hyperion hat geschrieben:Was genau liefert Dir dieser Code als Ausgabe?

Code: Alles auswählen

        for actor in tree.findall('//actor'):
                for name in actor.findall('name'):
                        print '%s: %s' % (name.tag.capitalize(), name.text)


Und dann beschreib doch noch mal bitte, was Dich daran stört bzw. was Du haben willst.


In der console bringt es
Name: Arlene Tur
Name: Jocko Sims
Name: Luis Chavez
Name: Nick E. Tarabay
Name: Moran Atias


wenn ich aber anschliessend

Code: Alles auswählen

print name.text
eingebe kommt
Name: Moran Atias


ich möchte, dass ein name erzeugt wird, der bei dem aufruf

Code: Alles auswählen

print name

das hier ausgegeben wird

Code: Alles auswählen

Name: Arlene Tur
Name: Jocko Sims
Name: Luis Chavez
Name: Nick E. Tarabay
Name: Moran Atias
lunar

Beitragvon lunar » Dienstag 21. April 2009, 17:35

Nutze eine Liste, an die du bei jedem Schleifendurchlauf die gefundenen Werte anhängst. Vor der Ausgabe fügst du diese Liste dann mit den Methoden zur Verarbeitung von Zeichenketten zusammen. Das solltest du aber wirklich alleine hinbekommen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 21. April 2009, 17:35

Code: Alles auswählen

In [1]: players = ["Shaun Murphy", "Ronnie O'Sullivan", "Steven Hendry"]

In [2]: for player in players:
   ...:     print player
   ...:
   ...:
Shaun Murphy
Ronnie O'Sullivan
Steven Hendry

In [3]: print player
------> print(player)
Steven Hendry

In [4]: print players
------> print(players)
['Shaun Murphy', "Ronnie O'Sullivan", 'Steven Hendry']

Du suchst Listen!

Genau das hast Du bei Dir quasi auch. "player" wird in jedem Schleifendurchlauf immer neu gebunden; daher ist nach der Schleife der letzte Name aus der Liste "players" noch an player gebunden.

Du musst also in Deiner Schleife einfach jedes Element in eine neue, vor der Schleife definierte Liste packen.

Auch wenn es nervt: Du solltest Dir wirklich mal das Tutorial angucken. Listen sind nun einmal essentiell wichtig!

OT: Ist das "'" ein netter "Bug" im Highlighting Modul?
lunar

Beitragvon lunar » Dienstag 21. April 2009, 17:37

Hey, schaut da jemand auch die WM in Shefield?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 21. April 2009, 17:50

Hyperion hat geschrieben:OT: Ist das "'" ein netter "Bug" im Highlighting Modul?

Wo?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 21. April 2009, 17:53

lunar hat geschrieben:Hey, schaut da jemand auch die WM in Shefield?

Aber Hallo ;-) Aber auch sonst gerne!

@Leonidas: Zeile 9 ... nach O'Sullivan wird alles rot - er erkennt das dort wohl als "String-Start-Token".
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 17:56

und ich verpass snooker, weil ich so nen käse nicht gebacken krieg :D

naja, wenn ich darf, halt ich euch auf dem laufenden, auch wenns mich vielleicht in ein NOCH schlechteres licht stellt ;)

dachte ich lasse ihn einfach bei jedem durchgang einen weiteren eintrag in eine liste anhängen. aber entweder hab ichs falsch gemacht, oder der gedanke war falsch.

Code: Alles auswählen

namelist = ""
if os.path.exists(tvshownfo):
        tree = etree.parse(tvshownfo)
        for actor in tree.findall('//actor'):
                for name in actor.getiterator('name'):
                        namelist.append(name.text)
                        print '%s: %s' % (name.tag.capitalize(), name.text)


kommt nämlich
AttributeError: 'str' object has no attribute 'append'


also mal weiter im tutorial suchen :)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 21. April 2009, 17:56

Hyperion hat geschrieben:@Leonidas: Zeile 9 ... nach O'Sullivan wird alles rot - er erkennt das dort wohl als "String-Start-Token".

Ja, als was auch sonst? Wenn du das in einen Editor schreibst dann tut der Editor und Python das gleiche. Weil Eingabe + Ausgaben eben kein gültiger Python-Code sind.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Dienstag 21. April 2009, 18:00

Naja, "namelist" soll ja auch eine Liste und keine Zeichenkette sein, also solltest du es auch als Liste initialisieren :)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 18:09

ich glaub ich habs geschnallt!

Code: Alles auswählen

currDir = os.getcwd()
tvshownfo = os.path.join(currDir,'tvshow.nfo')
namelist = []
if os.path.exists(tvshownfo):
        tree = etree.parse(tvshownfo)
        for actor in tree.findall('//actor'):
                for name in actor.findall('name'):
                        namelist.append(name.text)
                        print '%s: %s' % (name.tag.capitalize(), name.text)
und anschliessend print namelist eingebe
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 18:36

warum wundert mich das nicht.
jetzt muss ich natürlich den rest ändern, da eine liste natürlich nicht an ein label weitergereicht werden kann in enigma2

Code: Alles auswählen

TypeError: in method 'eLabel_setText', argument 2 of type 'std::string const &'



EDIT:
so, habs nun als liste erzeugt und dann zurückgewandelt

Code: Alles auswählen

namefinal = ', '.join(namelist)


nun muss ich als nächstes schauen, wie ich nun diesen neuen string nicht in einer zeile erzeugen lassen kann, sondern nach jedem eintrag eine neue zeile beginngen.

sprich jetzt ist es
Dennis Hopper, Clare Carey, Ross McCall, Brian Tee, Arlene Tur, Jocko Sims, Luis Chavez, Nick E. Tarabay, Moran Atias


so soll es sein
Dennis Hopper
Clare Carey
Ross McCall
Brian Tee
Arlene Tur
Jocko Sims
Luis Chavez
Nick E. Tarabay
Moran Atias




EDIT2:
und dank tutorial gleich beim ersten anlauf:

Code: Alles auswählen

namefinal = '\n'.join(namelist)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 21. April 2009, 22:29

so, hat nun alles wunderbar funktioniert und ich hab auch gleich was neues gelernt!

vielen dank!

nun werd ich zwar glecih mal versuchen müssen das nächste problem zu lösen, aber da weiss ich nicht, ob man mir da hier helfen kann, da ich nicht weiss, ob es in python generell sowas wie ePixmap oder ePicLoad gibt.

ich benutze nämlich nen linux-receiver, der mit dem normalen pixmap aufruf nur 8bit png unterstützt (wie alle dreamboxen).
also muss da was anderes her als PixmapFromFile().

aber falls ihr ein gutes modul gibt, dass mir bilder gut skaliert und dann aufruft :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder