problem mit linebreaks in strings in datei

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
Bersaelor
User
Beiträge: 7
Registriert: Dienstag 9. März 2010, 00:28
Kontaktdaten:

Hallo,
ich habe eine datei die lauter einträge der folgenden form hat:
/* Class = "IBUITextView"; text = "Well done,\nnow to look at the battlefield from a different angle, try moving a finger up and down!"; ObjectID = "17"; */
"17.text" = "Well done,\nnow to look at the battlefield from a different angle, try moving a finger up and down!";
Um einen solchen string in python zu erzeugen müsste ich im interpreter folgendes:

Code: Alles auswählen

>>> str = '"text\\nkdkkda alakalsk"\n'
>>> print str
"text\nkdkkda alakalsk"
Nun möchte ich gerne die '\n' dort herausbekommen. Das ginge mit den Strings im interpreter ganz einfach mit replace('\\n','') .

Mit den Zeilen aus meiner Datei geht es aber garnicht.
Wenn ich:

Code: Alles auswählen

print l.count('\\n')
print l.count('\n')
ausgeben lasse bekomme ich bei oben geposteten Zeilen immer die Ausgabe
0
1


Wisst ihr was ich falsch machen könnte?
Der Dateityp der datei ist nach mac os "strings" bzw. "plain text file".
[url=http://www.tactica.de/]Tactica-hexagonale Strategie fürs iPhone[/url]
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich kann dein Problem nicht so recht nachvollziehen. Sowas klappt doch:

Code: Alles auswählen

In [1]: s = "Well done,\nnow to look at the battlefield from a different angle, try moving a finger up and down!"

In [2]: s.replace('\n', ' ')
Out[2]: 'Well done, now to look at the battlefield from a different angle, try moving a finger up and down!'
problembär

Probier mal

Code: Alles auswählen

s = s.rstrip("\n")
Gruß
Bersaelor
User
Beiträge: 7
Registriert: Dienstag 9. März 2010, 00:28
Kontaktdaten:

Ich kann dein Problem nicht so recht nachvollziehen. Sowas klappt doch:
Schau dir den String nochmal genau an, die Strings in der Datei haben ja schon Anführungszeichen, deswegen das gepostete Beispiel im Interpreter mit '" "'.

Code: Alles auswählen

print 'before:', l
l = l.rstrip("\n")
print l
ergibt als ausgabe:

Code: Alles auswählen

before: "17.text" = "Well done,\nnow to look at the battlefield from a different angle, try moving a finger up and down!";

"17.text" = "Well done,\nnow to look at the battlefield from a different angle, try moving a finger up and down!";
[nach der zweiten ausgabe kommt keine neue zeile]

rstrip("\n") hat hier den linebreak am ende der zeile weggenommen, nicht die zeichen \ und n im string.
rstrip("\\n") dagegen ändert gar nichts an dem string, da ja auch count("\\n") 0 ausgibt.
[url=http://www.tactica.de/]Tactica-hexagonale Strategie fürs iPhone[/url]
Bersaelor
User
Beiträge: 7
Registriert: Dienstag 9. März 2010, 00:28
Kontaktdaten:

Ich hatte eine weitere Idee und ein seltsames Ergebnis:

Code: Alles auswählen

print 'before:', l
l = l.split("\n")
print l
type(l)
Output:

Code: Alles auswählen

before: "11.normalTitle" = "BACK";

['\x00"\x001\x001\x00.\x00', '\x00o\x00r\x00m\x00a\x00l\x00T\x00i\x00t\x00l\x00e\x00"\x00 \x00=\x00 \x00"\x00B\x00A\x00C\x00K\x00"\x00;\x00\n']
<type 'str'>
Ich hab gelesen das sei "shell code". Was hab ich falsch gemacht?

EDIT: (Post versehentlich auf englisch)
Sorry ich habe mit einem Kumpel auf englisch diskutiert und war in Gedanken. Wenn ich programmiere denk ich englisch (Kommentare in meinen Programmen sind auch immer englisch).
Naja schiebs auf die mathematikerverpeiltheit ;D
Zuletzt geändert von Bersaelor am Dienstag 30. März 2010, 22:16, insgesamt 1-mal geändert.
[url=http://www.tactica.de/]Tactica-hexagonale Strategie fürs iPhone[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Haste grade die deutsche Sprache verlernt? Im ersten Post konntest du doch auch noch wunderbar auf deutsch schreiben.
problembär

"\n" ist das Zeilenendezeichen (unter Linux).

Code: Alles auswählen

a = "Hallo\nWelt"
print a
"\\n" ist ein Backslash, der wörtlich genommen werden soll, was durch den vorangestellten (ersten) Backslash ausgedrückt wird sowie ein isoliertes "n".

Code: Alles auswählen

a = "Hallo\\nWelt"
print a
Nun mußt Du nur noch herausfinden, was genau Du ersetzen willst.
Bersaelor
User
Beiträge: 7
Registriert: Dienstag 9. März 2010, 00:28
Kontaktdaten:

Nun mußt Du nur noch herausfinden, was genau Du ersetzen willst.
Den Unterschied zwischen beiden habe ich ja selber auch schon erklärt :)

Das Problem liegt ja darin, dass nur ein "\n" als linebreak am Ende jeder Zeile vorkommt, wie einem count('\n') oder rfind('\n') sagt.
rfing('\\n') dagegen liefert als antwort immer -1 und count('\\n') immer 0.

Die Strings in der Datei sehen aber schon so aus wie gepostet und demnach müssten eigentlich '\\n' drin seien.

Ich bastel euch mal ein minimalbeispiel zusammen.

EDIT:
http://www.math.hu-berlin.de/~feiler/lbdeleter.py
http://www.math.hu-berlin.de/~feiler/example.strings

Vielleicht kommen wir der Sache so näher.
[url=http://www.tactica.de/]Tactica-hexagonale Strategie fürs iPhone[/url]
BlackJack

@Bersaelor: Deine Daten sind anscheinend UTF-16 kodiert. Also solltest Du Dich mal mit dem Thema Unicode beschäftigen und sie dekodieren bevor Du damit arbeitest.

Das sieht man ja recht deutlich an der Liste die Du beim Splitten erhalten hast. Das ist kein "shell code" -- wo hast Du das denn gelesen? Das sind einfach die Bytes, die Du da in den "Zeichen"ketten hast. Und bei UTF-16 das nur Zeichen aus dem ASCII-Bereich enthält ist jedes zweite Byte ein Nullbyte.
Bersaelor
User
Beiträge: 7
Registriert: Dienstag 9. März 2010, 00:28
Kontaktdaten:

Thanks so much, that was what I was searching for :)

Used

Code: Alles auswählen

file = codecs.open('example.strings','r', 'utf-16')
[url=http://www.tactica.de/]Tactica-hexagonale Strategie fürs iPhone[/url]
Antworten