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

Benutze mal die Suche im Forum nach Unicode und Fehler o.ä. Da findest Du eine Menge darüber, u.a. auch die Links zum wiki, wo das alles erklärt wird :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Vielleicht sollte man den Link über Unicode aus dem Wiki hier sticky machen, um so viele Fragen (die immer wieder die gleichen sind) über Unicode und Encodings vermeiden zu können.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

so, hab grad mal gesucht und im wiki das gefunden [wiki]Von Umlauten, Unicode und Encodings[/wiki]?highlight=%28unicode%29

nehme an, dass ich also nur umwandeln muss. kann ich irgendwie sehen in welches zielformat ich wandeln muss?
die xml sind laut header selbst utf-8.
aber da es zur fehlermeldung kam, nehme ich mal an, dass das system kein utf-8 unterstützt.
sehe ich das richtig?

also nach iso-8859-1 wandeln?

und muss ich den cookie setzen oder reicht es, wenn ich wandle und das system, falls es iso-8859-1 unterstützt kann das dann automatisch lesen?


EDIT:
gerade noch ein problem gefunden.

nutze folgenden code:

Code: Alles auswählen

currDir = os.getcwd()
tvnfo = os.path.join(currDir,'tv.nfo')
namelist = []
if os.path.exists(tvshownfo):
        # if currPlay is not None:
        tree = etree.parse(tvnfo)
        for actor in tree.findall('//actor'): 
                for name in actor.getiterator('role'):
                        namelist.append(name.text)
        namefinal = '\n'.join(namelist)
nur ist in der tv.nfo aber folgendes drin:
<actor>
<name>Not a regular</name>
<role />
<thumb>http://www.thetvdb.com/banners/actors/80669.jpg</thumb>
</actor>
das führt zu
rolefinal = '\n'.join(rolelist)
TypeError: sequence item 9: expected string, NoneType found
kann man ihn irgendwie dazu bringen solche fehler zu ignorieren?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Da gibts mehrere Möglichkeiten:

Code: Alles auswählen

# das fügt in der Ausgabe eine Leerzeile hinzu, vllt. ja erwünscht
...
namelist.append(name.text || '')
...


# fügt nur Text hinzu, kein leerer String oder None
# mit else könntest Du noch auf den fehlenden Eintrag hinweisen
...
for name in actor.getiterator('role'):
    if name.text:
        namelist.append(name.text)
...


# das ganze etwas anders gelöst
...
'\n'.join(i for i in namelist if i)
...

# oder mit hässlichem None
...
'\n'.join(str(i) for i in namelist)
...
Das Leben ist kein Wunschkonzert, Python schon eher ;)
BlackJack

Zeile 3 bleibt trotz allen Wünschens ein Syntaxfehler. :-P
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

upps, vllt. so dann:

Code: Alles auswählen

namelist.append(name.text or '')
:lol:
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

danke jerch. werd ich gleich mal ausprobieren!

das sieht ganz gut aus. würde das auch bei dem unicode fehler helfen oder wäre das damit nicht automatisch mit gelöst?

Code: Alles auswählen

for name in actor.getiterator('role'):
    if name.text:
        namelist.append(name.text)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

...würde das auch bei dem unicode fehler helfen oder wäre das damit nicht automatisch mit gelöst?
Nein, um das Ausgabe-Encoding mußt Du Dich schon selber kümmern. Da xml fast immer uft-8 kodiert daher kommt, dürfte es mit einem namefinal.encode('utf-8') getan sein.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

wollte nur kurz nochmal danke sagen!

das None type problem hat wunderbar geklappt.

und das encoding problem ebenfalls.

wie cih ja oben geschrieben hatte, war ich nicht sicher, ob ich ein cookie setzen muss (scheinbar nicht) und ob ich in das native encoding der box benutzen muss oder ob die box alles kann, solange man ihr sagt, dass es utf-8 ursprünglich war.

offensichtlich letzteres :)

danke euch!

ich bin sicher, dass ich den thread demnächst wieder hochhole....wäre zu einfach, wenn im rest keine fehler mehr auftauchen würden :D
Antworten