utf-8, codecs, regexp, list & co - Hilfe^^

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.
Antworten
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Morgen euch^^,

Also hab folgendes Problem:

Ich habe ein *.txt mit dem codecs module und utf-8 kodierung geöffnet.
Anschließend jede Zeile in eine Variable gepackt, und danach bestimmte Teile die ich bennötige mit regexp (reguläre Ausdrücke) herausgesucht (re.findall(u".....)). Anschließend das, was mir die regexp zurückgegeben hat in eine Liste gepackt und die nötigen Teile zurück zu UTF-8 kodiert .encode("utf-8").decode("utf-8") bevor in die Liste gespeichert. Jedoch wenn ich mir die Liste dann über print ausgeben lasse, gibt er mir wieder nicht die Umlaute richtig aus. Wollte deshalb fragen, ob es eine Möglichkeit gibt, dass er mir auch in einer Liste das utf-8 beibehält (ä,ö,ü,ß...., ohne dem \x... also komplett so wie davor) (hab auch mal repr() mit encode() bzw decode() probiert, ohne erfolg).

Desweiteren:
danach schreibe ich das was in der liste ist und einige weitere Strings in eine andere Datei jedoch ignoriert mir da das codecs module jeglichen Zeilenumbruch \n (bei den weiteren Strings), was kann das sein?

Vielen Dank voraus!:D

mfg
Meitei
BlackJack

@Meitei: ``.encode("utf-8").decode("utf-8")`` ist im Grunde eine Identitätsfunktion, da kommt wieder das heraus, was man vorher schon einmal hatte (wenn das `unicode` war).

Die `__str__()`-Methode von Listen verwendet immer `repr()` auf den einzelnen Elementen. Listen will man ja sowieso nur zur Fehlersuche ausgeben und da ist es eben praktischer eine Darstellung zu haben, die nur aus ASCII-Zeichen besteht und bei der man *genau* nachvollziehen kann, was da in der Liste steht. Und das unabhängig davon welche Kodierung zur Anzeige der Liste erwartet wird (solange ASCII eine Untermenge davon ist).

Wenn Du eine listenähnliche Darstellung in der Kodierung Deiner Wahl haben möchtest, musst Du die selber schreiben. Also zum Beispiel ``(u'[%s]' % u', '.join(liste)).encode('utf-8')``.
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Vielen Dank für die Antwort BlackJack.
Nur mein Problem ist, ich brauche "wirkliche" Listen da ich später über klassen darauf zugreife und noch ein paar sachen mit PIL (Python Image Library) dort machen werde (ImageFont, ImageDraw, ...).

Was kann das Problem mit dem codes module mit \newline sein?

Danke im voraus^^

seey'
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Also ich vermute, dass du schon das richtige in den Listen drinhast. Das siehst du, wenn du ein Listenelement mit print ausgeben lässt. Dass beim zeilenweisen Einlesen einer Datei das Zeilenumbruchszeichen entfernt wird ist auch Standard.
BlackJack

@Meitei: Wenn Du Listen intern benötigst, dann ist es doch egal wie die als Zeichenketten aussehen würden!? Wenn Du *Ausgaben* in einer bestimmten Form brauchst, musst Du die eben entsprechend in diese Form bringen.

Bei dem '\n' tippe ich mal auf ein Problem mit der Anwendung, die das darstellt. Du bist nicht zufällig unter Windows unterwegs? Da können nicht alle Programme mit einem einzelnen '\n' etwas anfangen, sondern erwarten die Kombination '\r\n'.
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Wenn ich es ohne dem codecs module mache, funktioniert es einwandfrei. Da es viele strings sind hab ich es in einer einzigen liste zur besseren Anschaung und beim schreiben mach ich dann

file_out.write(str_lis[0]+str_txt)
file_out.close()
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Ja, aber wird das dann dadurch das es in der Liste nicht richtig dargestellt wird und wenn ich es dann rausnehme und mit PIL bearbeite Dinge wie width, height verfälscht?

Außerdem wenn ich dann den Inhalt der Listen also alle unicode Teile und integer rausnheme eine Klasse mache die darauf zugreift und diese dann als Strings in eine Datei schreiben ist es ja nicht mehr 100% UTF-8, was ich aber brauche^^
BlackJack

@Meitei: Die Zeichenkettendarstellung von einem Objekt und das Objekt selbst sind zwei verschiedene Dinge. Das eine Zeichenkette in einer Liste als Zeichenkette anders *dargestellt* wird, als wenn man die Zeichenkette selbst als Zeichenkette darstellt, verändert ja das Objekt nicht.

Den zweiten Absatz habe ich so gar nicht verstanden. Ich denke aber mal das sind Verständnisschwierigkeiten Deinerseits was den Unterschied zwischen abstrakten Objekten und konkreten Darstellungen als Bytes betrifft.

Wenn Du eine Bytedarstellung als UTF-8 kodiert haben möchtest, musst *Du* dafür sorgen, dass beim Übergang von beliebigen Objekten in Bytes, die man in eine Datei schreiben kann, diese Objekte korrekt umgewandelt und kodiert werden.
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Mal danke für die Antwort^^... Sry, war 'ne Woche im Urlaub und bin erst gerade nach Hause gekommen^^''''.

"Wenn Du eine Bytedarstellung als UTF-8 kodiert haben möchtest, musst *Du* dafür sorgen, dass beim Übergang von beliebigen Objekten in Bytes, die man in eine Datei schreiben kann, diese Objekte korrekt umgewandelt und kodiert werden."

Ja, glaube das ist es xD. Weil wenn ich es versuche ohne Umlaute hat die .txt die Kodierung ANSI mit umlauten UTF-8 aber anscheinend nicht wirklich^^.
Ich hab mal beim "sys" module geschaut - das default encoding ist "ascii" egal wann, somit dachte ich mir wenn ich das auf utf-8 ändern könnte, dass es dann eig. passen sollte, also hab ich mal in der Hilfe weitergesucht und bin auf "setdefaultencoding( name)" im sys module gestoßen. Nun steht dort was von dem "site" module was ich nicht ganz verstehe - nun wollte ich folgendes wissen?

1. Würde das mit dem "setdefaultencoding" mein Problem lösen
2. Wie "genau" kommt ich dort hin, weil in sys ist es nicht wenn ich mir die Hilfe von dem anschaue (also print help(sys) ) und im site auch nicht und ja :(
3. Falls das nicht mein Problem lösen sollte, "wie dann"?

Würde mich über eine Antwort freuen^^

seey'
BlackJack

@Meitei: Zu 1. Damit solltest Du Dein Problem nicht lösen wollen, denn 2. genau weil man das nicht benutzen soll, wird die Funktion `setdefaultencoding()` nach dem Importieren des `site`-Moduls entfernt. Das würde für alle Module gelten. Die Leute, die Module schreiben erwarten aber, dass das dort auf ASCII gestellt ist, weil man das ja nicht verändern soll.

Zu 3. Das habe ich doch eigentlich schon geschrieben: Du musst Unicode verstehen, und den Zusammenhang zwischen abstrakten Unicode-Zeichen und einer konkreten Kodierung davon als Bytes. Du musst an jeder Stelle in Deinem Programm wissen, was Du da vor Dir hast, und Du musst an den Ein- und Ausgängen von Daten in Deinem Programm dafür sorgen, dass die entsprechend de- und encodiert werden. Explizit.
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Danke für die Antwort^^... Ich habe eh schon ein paar Dinge über UTF-8 und Unicode gelesen (das mit dem das UTF-8 über 128 ist und ASCII nur bis 127 geht?? und auch hier im Forum - bin gerade auf weiterer Suche^^)
Kennst du vll. noch ein paar gute Quellen zum Nachschlagen?

Ich habe versucht beim Dateischreiben anstatt codes.open() file() mit "wb" mode zu nehmen (b müsste ja sein das er den byte code dazunimmt???) und dann bei readlines(codecs.BOM_UTF8) und danach was ich reinschreiben will mit encode("utf-8").decode("utf8") versehen habe, aber leider ohne erfolg. Ich brauche wohl oder übel noch mehr Information xD. Aber das gute ist, jetzt wenn ich keine Umlaute dabei habe kodiert er mir die Datei in UTF-8:D


seey';)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Meitei hat geschrieben: das UTF-8 über 128 ist und ASCII nur bis 127 geht??
ASCII enthält nur 127 Zeichen, das ist richtig. UTF-8 codiert alle Zeichen des Unicode-Raumes und ist in den ersten 127 Zeichen mit ASCII identisch.
Meitei
User
Beiträge: 15
Registriert: Donnerstag 23. Juli 2009, 10:20
Wohnort: Österreich (Niederösterreich)

Danke an alle für die hilfreichen Antworten^^.
Konnte mein Problem (jetzt hoffentlich entgültig) lösen:P:D.

Vielen Dank nochmal, und hoffentlich darf ich mich bei weiteren Problemen an euch weden.

seey';)
Antworten