Seite 1 von 1

problem mit linebreaks in strings in datei

Verfasst: Dienstag 30. März 2010, 18:22
von Bersaelor
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".

Verfasst: Dienstag 30. März 2010, 18:28
von snafu
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!'

Verfasst: Dienstag 30. März 2010, 18:57
von problembär
Probier mal

Code: Alles auswählen

s = s.rstrip("\n")
Gruß

Verfasst: Dienstag 30. März 2010, 19:25
von Bersaelor
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.

Verfasst: Dienstag 30. März 2010, 21:33
von Bersaelor
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

Verfasst: Dienstag 30. März 2010, 22:12
von derdon
Haste grade die deutsche Sprache verlernt? Im ersten Post konntest du doch auch noch wunderbar auf deutsch schreiben.

Verfasst: Mittwoch 31. März 2010, 00:33
von 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.

Verfasst: Mittwoch 31. März 2010, 05:11
von Bersaelor
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.

Verfasst: Mittwoch 31. März 2010, 07:08
von 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.

Verfasst: Mittwoch 31. März 2010, 08:44
von Bersaelor
Thanks so much, that was what I was searching for :)

Used

Code: Alles auswählen

file = codecs.open('example.strings','r', 'utf-16')