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

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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

Hey, schaut da jemand auch die WM in Shefield?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:OT: Ist das "'" ein netter "Bug" im Highlighting Modul?
Wo?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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 :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
lunar

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

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

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

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

mocca hat geschrieben: ..., da ich nicht weiss, ob es in python generell sowas wie ePixmap oder ePicLoad gibt.
Was genau ist das? (Domäne?)
ich benutze nämlich nen linux-receiver, der mit dem normalen pixmap aufruf nur 8bit png unterstützt (wie alle dreamboxen).
Was ist das? Receiver kenne ich vom TV-Empfang her ... "dreamboxen" sagt mir gar nix ;-)
TiKaey
User
Beiträge: 84
Registriert: Montag 24. November 2008, 20:48

Ich vermute mal, ein Linuxbasierter DVB-Receiver ist gemeint. :o)
http://de.wikipedia.org/wiki/Dreambox
BlackJack

@mocca: Zum skalieren von Bildern gibt's die `Python Imaging Library`, kurz `PIL`.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

ja, von der PIL habe ich gehört.
ist eine sammlung aus modulen, unter anderem JPEGImagePlugin.py

hab es mit mal runtergeladen, muss mich da aber mal durcharbeiten, weil ich noch nicht weiss, wie man die benutzt :oops:

hatte gehofft, dass das irgendwie einfacher lösbar ist, aber es scheitert schon am aufrufen eines jpeg, denn die werden ja nativ nicht unterstützt vom ePixmap. png kein problem, aber ich muss das nun umschreiben für jpeg.


zum alten thema nochmal kurz:
das erstellen der liste und dann konvertieren der liste in von mir gewünschte "optik" ;) hat bestens geklappt.
danke dafür.

gibts hier im forum einen bereich, wo man auch ein bisschen enigma2 basiert fragen kann?
das mit den bildern scheint nämlich kniffliger zu sein als gedacht.
viele klassen, wie MediaPixmap laden nämlich die bilder nicht so zuverlässig.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

sorry, dass ich den thread nochmal hochhole.

aber ich habe nun ja den string mit meinen objekten erzeugt.

nun musste ich aber heute bei nem testdurchlauf feststellen, dass es zu problemen kommt, wenn in diesen non-ascii code ist
'ascii' codec can't encode character u'\xed' in position 160: ordinal not in range(128)
kann ich den string filtern lassen, sodass alle nicht ascii zeichen entfernt werden oder noch besser, sodass all nicht ascii ersetzt werden (í zu i, é zu e etc.)?
Antworten