Umwandlung repr() -> String

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
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Donnerstag 17. Januar 2008, 11:54

Hi!
Ich komme gerade einfach nicht drauf wie ich einen String, den ich als repr(string) gespeichert habe, wieder interpretiert, also die Steuerzeichen ('\n' etc) umgesetzt bekomme.
Hat jemand n Tipp für mich?

Schönen Gruß
KoenigGunther
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 17. Januar 2008, 11:56

KoenigGunther hat geschrieben:Hi!
Ich komme gerade einfach nicht drauf wie ich einen String, den ich als repr(string) gespeichert habe, wieder interpretiert, also die Steuerzeichen ('\n' etc) umgesetzt bekomme.
Hat jemand n Tipp für mich?

Schönen Gruß
KoenigGunther
Hmpf, ich glaube du verstehst da etwas falsch... Diese "Steuerzeichen" werden erst bei der Ausgabe beachtet, vorher sind's ganz normale Zeichen. Repr brauchst du übrigens nie aufzurufen, str ist eindeutiger.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Donnerstag 17. Januar 2008, 12:40

Code: Alles auswählen

>>> def unquote_string(s):
...  assert s and s[0] == s[-1] and s[0] in '"\''
...  return s[1:-1].decode('string-escape')
... 
>>> unquote_string(r'"\nfoo"')
'\nfoo'
TUFKAB – the user formerly known as blackbird
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Freitag 18. Januar 2008, 08:29

Wie müsste ich denn die "\" ersetzen?
Angenommen ich habe

Code: Alles auswählen

>>> s = "\n"
>>> s
'\n'
>>> "\" in s
  File "<stdin>", line 1
    "\" in s
           ^
SyntaxError: EOL while scanning single-quoted string
>>> "\\" in s
False
>>> 
Dass beim ersten Mal ein Fehler geworfen werden muss ist mir klar, aber dass das zweite dann nicht gefunden wird verstehe ich noch nicht so wirklich.
BlackJack

Freitag 18. Januar 2008, 09:31

`s` enthält *ein* Zeichen, nämlich das Zeilenende-Zeichen mit dem Bytewert 10. Da ist kein Backslash drin. Die beiden Zeichen r'\n' sind ja nur eine Ersatzdarstellung für dieses eine Zeichen in der `repr()`-Form der Zeichenkette, damit man das Zeichen überhaupt sehen kann.

Code: Alles auswählen

In [7]: s = '\n'

In [8]: s
Out[8]: '\n'

In [9]: len(s)
Out[9]: 1

In [10]: ord(s)
Out[10]: 10
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Samstag 19. Januar 2008, 18:59

Hm... Ich schreibe beispielsweise den String

Code: Alles auswählen

s = "hallo\nhallo2"
in eine Datei. Da darf das "\n" aber nicht interpretiert werden, weswegen ich da ein "\\n" draus machen möchte. Da ich ein bestehendes Programm erweitere ist es mir nicht möglich den String als raw zu deklarieren (never change a running system), sondern muss irgendwie den "\" verdoppeln. Natürlich dann bei allen Steuerzeichen wie "\n", "\t", etc...
BlackJack

Samstag 19. Januar 2008, 19:08

Das hat mitsuhiko schon fast gezeigt. Es gibt 'string-escape' natürlich auch in die andere Richtung:

Code: Alles auswählen

In [106]: s.encode('string-escape')
Out[106]: 'hallo\\nhallo2'
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Sonntag 20. Januar 2008, 10:59

Hm, Mist, das hab ich irgendwie übersehen :)
Danke sehr!
Antworten