Aus r'\012' einen Zeilenumbruch ohne if erzeugen
Hallo Zusammen, ich habe folgende Problem: - In einer Testdatei (INI-Format) steht 'schluessel = \012' - Mit der Klasse ConfigParser.ConfigParser lese ich diesen Eintrag aus - Ergebnis r'\012' der Variablen - Bei der Ausgabe in einer Datei/Console möchte ich daraus einen Zeilenumbruch erzeugen - leider erhalte ich immer nur den raw-String Ich habe das Gefuehl ich drehe mich bei meinen Loesungen immer im Kreis. Wenn jemand einen Vorschlag hat waehre es super fuer einen Tipp. Danke ;-) Martin Möllenbeck Honigmannstraße 1 45896 Gelsenkirchen Tel: +49 (0177) 8 45 74 70 mailto:Martin.Moellenbeck@t-online.de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Am Mon, 10 Feb 2003 18:35:59 +0100 Schrieb Martin.Moellenbeck@t-online.de (Martin Möllenbeck):
Hallo Zusammen,
ich habe folgende Problem:
- In einer Testdatei (INI-Format) steht 'schluessel = \012' - Mit der Klasse ConfigParser.ConfigParser lese ich diesen Eintrag aus - Ergebnis r'\012' der Variablen - Bei der Ausgabe in einer Datei/Console möchte ich daraus einen Zeilenumbruch erzeugen - leider erhalte ich immer nur den raw-String
Ich habe das Gefuehl ich drehe mich bei meinen Loesungen immer im Kreis. Wenn jemand einen Vorschlag hat waehre es super fuer einen Tipp.
Danke ;-)
Martin Möllenbeck
Hallo Martin, -------------------------------------
erg = r'\012' erg.replace(r'\012', '\n') '\n' print erg.replace(r'\012', '\n')
geht natürlich auch mit strings die noch zusätzliche Zeichen enthalten -------------------------------------
erg = r'Hallo\012Welt' print erg.replace(r'\012', '\n') Hallo Welt
Gruß Fritz _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Hallo Fritz, Danke fuer die schnelle Hilfe, aber ich glaube ich habe mich nicht ganz verstaendlich ausgedrueckt. In der INI-Datei steht nicht immer 'schluessel = \012'. Daher suche ich nach einer Loesung, die mir die Möglichkeit gibt. Sonderzeichen (\012 oder Aehnliche) durch einen generischen Ansatz zu transformieren. Eigendlich moechte ich nicht den Raw-String, sondern den durch Python interpretierten/evaluierten String haben. An der Konsole:
a = '\012' a '\n'
Ich bekomme aber dieses Verhalten
a = r'\012' a '\\012'
Ich hoffe du oder ihr habt dazu einen weiterfuehrenden Tipp. Gruss Martin -----Ursprüngliche Nachricht----- Von: python-de-admin@python.net [mailto:python-de-admin@python.net] Im Auftrag von Fritz Cizmarov Gesendet: Montag, 10. Februar 2003 19:14 An: python-de@python.net Betreff: Re: [Python-de] Aus r'\012' einen Zeilenumbruch ohne if erzeugen Am Mon, 10 Feb 2003 18:35:59 +0100 Schrieb Martin.Moellenbeck@t-online.de (Martin Möllenbeck):
Hallo Zusammen,
ich habe folgende Problem:
- In einer Testdatei (INI-Format) steht 'schluessel = \012' - Mit der Klasse ConfigParser.ConfigParser lese ich diesen Eintrag aus - Ergebnis r'\012' der Variablen - Bei der Ausgabe in einer Datei/Console möchte ich daraus einen Zeilenumbruch erzeugen - leider erhalte ich immer nur den raw-String
Ich habe das Gefuehl ich drehe mich bei meinen Loesungen immer im Kreis. Wenn jemand einen Vorschlag hat waehre es super fuer einen Tipp.
Danke ;-)
Martin Möllenbeck
Hallo Martin, -------------------------------------
erg = r'\012' erg.replace(r'\012', '\n') '\n' print erg.replace(r'\012', '\n')
geht natürlich auch mit strings die noch zusätzliche Zeichen enthalten -------------------------------------
erg = r'Hallo\012Welt' print erg.replace(r'\012', '\n') Hallo Welt
Gruß Fritz _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Fritz Cizmarov wrote:
erg.replace(r'\012', '\n')
Ich hoffe, das ist ein Scherz?
'\n' is '\012' 1 '\n' == '\012' 1 '\n' '\n' '\012' '\n' print '\n'
print '\012'
Das \012 ist schlicht die numerische Repraesentation des <newline> characters, also mit '\n' identisch. Ehrlich gesagt verstehe ich deswegen weder das urspruengliche Problem noch die vermeintliche Loesung so ganz... -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Hallo Georg, zu beachten bei dem Problem:
r'\012' == '\012' 0
hier handelt es sich eine Raw-String und eine bei dem die "Sonderzeichen" evaluiert werden. Gruss Martin -----Ursprüngliche Nachricht----- Von: python-de-admin@python.net [mailto:python-de-admin@python.net] Im Auftrag von Georg Mischler Gesendet: Montag, 10. Februar 2003 20:01 An: python-de@python.net Betreff: Re: [Python-de] Aus r'\012' einen Zeilenumbruch ohne if erzeugen Fritz Cizmarov wrote:
erg.replace(r'\012', '\n')
Ich hoffe, das ist ein Scherz?
'\n' is '\012' 1 '\n' == '\012' 1 '\n' '\n' '\012' '\n' print '\n'
print '\012'
Das \012 ist schlicht die numerische Repraesentation des <newline> characters, also mit '\n' identisch. Ehrlich gesagt verstehe ich deswegen weder das urspruengliche Problem noch die vermeintliche Loesung so ganz... -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Martin Möllenbeck wrote:
Hallo Georg,
zu beachten bei dem Problem:
r'\012' == '\012' 0
hier handelt es sich eine Raw-String und eine bei dem die "Sonderzeichen" evaluiert werden.
Das schon, nur bringe ich es beim besten Willen nicht fertig, Einem ConfigParser.ConfigParser-Objekt einen String mit "ausgeschriebenen" Sonderzeichen zu entlocken, wenn die eingelesene Datei der Formatspezifikation entspricht. So wie ich die Frage wenigstens ansatzweise verstanden habe, scheint das aber dort zu passieren. Das kann nur heissen, dass irgendwer vorher die explizite Zeichenfolge '\'+'0'+'1'+'2' in die Datei reingeschrieben hat. Einen Fehler bei der Erstellung der Datei durch Massnahmen beim Lesen derselben zu beheben, wuerde ich selber nach Moeglichkeit vermeiden. Viel besser ist es, die eigentliche Ursache des Problems zu beheben. Oder hatte der Fragesteller tatsaechlich die Absicht, Dem entsprechenden Schluessel ein <newline> als Wert zuzuordnen? -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Georg Mischler wrote:
Oder hatte der Fragesteller...
Oops, das warst du ja selber, sorry! :) -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Hallo Georg, in der INI-Datei sollte unter dem Schluessel eine <newline> gespeichert werden. Auszug aus der INI-Datei: <snip> lineseparator = \012 <snip> Wenn ich diesem Wert in der Ini-Datei speichere, bekomme ich beim Auslesen den Wert "r'\012'". Jetzt moechte ich aus diesem Text das 'eigentliche' Newline bekommen. Gruss Martin -----Ursprüngliche Nachricht----- Von: python-de-admin@python.net [mailto:python-de-admin@python.net] Im Auftrag von Georg Mischler Gesendet: Montag, 10. Februar 2003 20:29 An: python-de@python.net Betreff: Re: AW: [Python-de] Aus r'\012' einen Zeilenumbruch ohne if erzeugen Martin Möllenbeck wrote:
Hallo Georg,
zu beachten bei dem Problem:
r'\012' == '\012' 0
hier handelt es sich eine Raw-String und eine bei dem die "Sonderzeichen" evaluiert werden.
Das schon, nur bringe ich es beim besten Willen nicht fertig, Einem ConfigParser.ConfigParser-Objekt einen String mit "ausgeschriebenen" Sonderzeichen zu entlocken, wenn die eingelesene Datei der Formatspezifikation entspricht. So wie ich die Frage wenigstens ansatzweise verstanden habe, scheint das aber dort zu passieren. Das kann nur heissen, dass irgendwer vorher die explizite Zeichenfolge '\'+'0'+'1'+'2' in die Datei reingeschrieben hat. Einen Fehler bei der Erstellung der Datei durch Massnahmen beim Lesen derselben zu beheben, wuerde ich selber nach Moeglichkeit vermeiden. Viel besser ist es, die eigentliche Ursache des Problems zu beheben. Oder hatte der Fragesteller tatsaechlich die Absicht, Dem entsprechenden Schluessel ein <newline> als Wert zuzuordnen? -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Martin Möllenbeck wrote:
Hallo Georg,
in der INI-Datei sollte unter dem Schluessel eine <newline> gespeichert werden.
Auszug aus der INI-Datei: <snip> lineseparator = \012 <snip>
Wenn ich diesem Wert in der Ini-Datei speichere, bekomme ich beim Auslesen den Wert "r'\012'". Jetzt moechte ich aus diesem Text das 'eigentliche' Newline bekommen.
Ah, jetzt verstehe ich... Ein binaeres <newline> ist als Wert in einer solchen Datei nicht moeglich, weil das gleiche Zeichen ja die einzelnen Eintraege voneinander trennt. Du musst also tatsaechlich die explizite Zeichenfolge '\012' da reinschreiben. So weit, so gut. Mir ist allerdings keine eingebaute Funktion bekannt, welche diese Form in die jeweilige binaere Representation umformt. Normalerweise wird sie ja nur als "literal" im Code verwendet. Damit kriegen wir aber auch gleich wieder eine Hintertuer. Wir bauen den String einfach in ein Stueck Code ein, und fuehren diesen direkt aus: def decode_literal(s): statement = compile('value = "%s"' % s, '', 'single') exec statement return value Das ist ein ziemlich fortgeschrittenes Voodoo-Ritual, aber es funktioniert erst mal... Wenn du dabei sicherheitstechnische Bedenken hast (zurecht!), dann solltest du vorher noch dafuer sorgen, dass s keine Klammern, Semikolons oder echte <newline>s etc. enthaelt. Diese wuerden es naemlich moeglich machen, deine Funktion mittels einer untergeschobenen Datei beliebigen Code ausfuehren zu lassen. Das waere dann das Python-Aequivalent der beruehmten Buffer-Overflows in C. Sicher bist du z.B. dann, wenn du nur einen fuehrenden Backslash und nachfolgende Zahlen akzeptierst, was fuer deinen Zweck ja reichen sollte. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
On Mon, 10 Feb 2003 15:03:40 -0500 (EST), Georg Mischler wrote:
def decode_literal(s): statement = compile('value = "%s"' % s, '', 'single') exec statement return value
Das ist ein ziemlich fortgeschrittenes Voodoo-Ritual, aber es funktioniert erst mal... Wenn du dabei sicherheitstechnische Bedenken hast (zurecht!), dann solltest du vorher noch dafuer sorgen, dass s keine Klammern, Semikolons oder echte <newline>s etc. enthaelt.
Oder gleich mal eval() verwenden, das reduziert die möglichen Seiteneffekte. Viel sauberer ist BTW dieses: p = ConfigParser({'LF': '\n', 'TAB': '\t', ...}) und lineseparator = %(LF)s Ciao, Jürgen _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
Hallo Georg, das war genau der Tipp den ich brauchte. ;-)) Ich danke Dir und wuensche noch einen schoenen Abend. Gruss Martin -----Ursprüngliche Nachricht----- Von: python-de-admin@python.net [mailto:python-de-admin@python.net] Im Auftrag von Georg Mischler Gesendet: Montag, 10. Februar 2003 21:04 An: python-de@python.net Betreff: Re: [Python-de] Aus r'\012' einen Zeilenumbruch ohne if erzeugen Martin Möllenbeck wrote:
Hallo Georg,
in der INI-Datei sollte unter dem Schluessel eine <newline> gespeichert werden.
Auszug aus der INI-Datei: <snip> lineseparator = \012 <snip>
Wenn ich diesem Wert in der Ini-Datei speichere, bekomme ich beim Auslesen den Wert "r'\012'". Jetzt moechte ich aus diesem Text das 'eigentliche' Newline bekommen.
Ah, jetzt verstehe ich... Ein binaeres <newline> ist als Wert in einer solchen Datei nicht moeglich, weil das gleiche Zeichen ja die einzelnen Eintraege voneinander trennt. Du musst also tatsaechlich die explizite Zeichenfolge '\012' da reinschreiben. So weit, so gut. Mir ist allerdings keine eingebaute Funktion bekannt, welche diese Form in die jeweilige binaere Representation umformt. Normalerweise wird sie ja nur als "literal" im Code verwendet. Damit kriegen wir aber auch gleich wieder eine Hintertuer. Wir bauen den String einfach in ein Stueck Code ein, und fuehren diesen direkt aus: def decode_literal(s): statement = compile('value = "%s"' % s, '', 'single') exec statement return value Das ist ein ziemlich fortgeschrittenes Voodoo-Ritual, aber es funktioniert erst mal... Wenn du dabei sicherheitstechnische Bedenken hast (zurecht!), dann solltest du vorher noch dafuer sorgen, dass s keine Klammern, Semikolons oder echte <newline>s etc. enthaelt. Diese wuerden es naemlich moeglich machen, deine Funktion mittels einer untergeschobenen Datei beliebigen Code ausfuehren zu lassen. Das waere dann das Python-Aequivalent der beruehmten Buffer-Overflows in C. Sicher bist du z.B. dann, wenn du nur einen fuehrenden Backslash und nachfolgende Zahlen akzeptierst, was fuer deinen Zweck ja reichen sollte. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@starship.python.net http://starship.python.net/mailman/listinfo/python-de
participants (4)
-
Fritz Cizmarov
-
Georg Mischler
-
Juergen Hermann
-
Martin.Moellenbeck@t-online.de