Wie kann ich das letzte Zeichen einer Zeichenfolge entfernen, wenn es sich um einen Zeilenumbruch handelt?
"abc\n" --> "abc"
Wie kann ich das letzte Zeichen einer Zeichenfolge entfernen, wenn es sich um einen Zeilenumbruch handelt?
"abc\n" --> "abc"
Probieren Sie die Methode aus rstrip()
(siehe dok Python 2 und Python 3)
>>> 'test string\n'.rstrip()
'test string'
Pythons rstrip()
Methodenstreifen alle Arten von Leerzeichen am Ende, nicht nur ein Zeilenumbruch, wie es Perl tut chomp
.
>>> 'test string \n \r\n\n\r \n\n'.rstrip()
'test string'
So entfernen Sie nur Zeilenumbrüche:
>>> 'test string \n \r\n\n\r \n\n'.rstrip('\n')
'test string \n \r\n\n\r '
Zusätzlich zu rstrip()
gibt es auch die Methoden strip()
und lstrip()
. Hier ist ein Beispiel mit den dreien:
>>> s = " \n\r\n \n abc def \n\r\n \n "
>>> s.strip()
'abc def'
>>> s.lstrip()
'abc def \n\r\n \n '
>>> s.rstrip()
' \n\r\n \n abc def'
Ich bin keine Python-Person, also habe ich keine Antwort darauf, aber Perls chomp() entfernt tatsächlich das Trennzeichen für Eingabedatensätze am Ende. Das ist ein Zeilenumbruch bei Unixy-Dingen, kann aber anders sein (z. B. Windows) und ist veränderbar. Gibt es eine Möglichkeit, diesen Wert nur einmal vom Ende einer Zeichenfolge zu entfernen?
– Brian D. Foy
8. November 2008 um 21:04 Uhr
brian d foy: Python hat kein Trennzeichen für Eingabedatensätze wie awk und Perl.
– Peter Hosey
9. November 2008 um 6:13 Uhr
@csde_rats, das stimmt nicht: OS X verwendet \n
für Zeilenumbrüche genau wie Unix. (Vor OS X verwendete MacOS \r
als Linientrenner, aber das endete vor 10 Jahren.)
– skue
4. November 2012 um 19:03 Uhr
@briandfoy Python bietet integrierte Unterstützung für universelle Zeilenumbrüche (nur beim Lesen, nicht beim Schreiben). Sie öffnen die Datei entweder im “U”- oder “rU”-Modus, und unabhängig von Windows, Linux, Mac, was auch immer, bis der Text Ihren Python-Code erreicht, wurde jeder Zeilenumbruch durch “\n” ersetzt. Sehen: python.org/dev/peps/pep-0278
– AlcubierreDrive
7. November 2012 um 8:11 Uhr
Ich werde weitermachen und das buchstabieren, weil ich ein Noob bin und mich eine Weile gefragt habe, warum es nicht funktioniert hat. .strip()
ändert die Zeichenfolge nicht (hat wahrscheinlich etwas mit unveränderlichen Zeichenfolgen zu tun). Wenn nicht in der Befehlszeile, möchten Sie "string = string.strip()"
– Script Kitty
12. April 2016 um 1:06 Uhr
Und ich würde sagen, der “pythonische” Weg, Zeilen ohne nachgestellte Zeilenumbruchzeichen zu erhalten, ist splitlines().
>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
Hinweis: str.splitlines()
behandelt viele Zeichen als Zeilenumbrüche (nicht nur \r
, \n
)
– jfs
25. Januar 2016 um 6:57 Uhr
Dies führt auch zu unerwarteten Ergebnissen, wenn Sie eine mehrzeilige Zeichenfolge haben und nur den letzten Zeilenabschluss entfernen möchten … (obwohl es wahrscheinlich dafür wieder verbunden werden kann).
– Gert van den Berg
31. Dezember 2021 um 19:27 Uhr
@GertvandenBerg die Methode wird aufgerufen splitlines()
. Wenn ich ihm ein Multi-Linie string, ich erwarte nicht, dass es nur die letzte Zeile entfernt, weil ich ihm buchstäblich gesagt habe, dass es meinen mehrzeiligen String an den Zeilenumbrüchen in mehrere Strings aufteilen soll;) Es ist tatsächlich so, es zu verwenden, um Zeilenenden von einem einzeiligen String zu entfernen nur ein nützliches Eckgehäuse.
– SvenS
5. Mai 2022 um 10:51 Uhr
Mike
Die kanonische Methode zum Entfernen von Zeilenendezeichen (EOL) besteht darin, die Methode string rstrip() zu verwenden, die alle nachgestellten \r oder \n entfernt. Hier sind Beispiele für Mac-, Windows- und Unix-EOL-Zeichen.
>>> 'Mac EOL\r'.rstrip('\r\n')
'Mac EOL'
>>> 'Windows EOL\r\n'.rstrip('\r\n')
'Windows EOL'
>>> 'Unix EOL\n'.rstrip('\r\n')
'Unix EOL'
Die Verwendung von ‘\r\n’ als Parameter für rstrip bedeutet, dass alle nachgestellten Kombinationen von ‘\r’ oder ‘\n’ entfernt werden. Deshalb funktioniert es in allen drei oben genannten Fällen.
Diese Nuance ist in seltenen Fällen von Bedeutung. Ich musste zum Beispiel einmal eine Textdatei verarbeiten, die eine HL7-Nachricht enthielt. Der HL7-Standard erfordert ein nachgestelltes „\r“ als EOL-Zeichen. Der Windows-Computer, auf dem ich diese Nachricht verwendet habe, hatte sein eigenes EOL-Zeichen „\r\n“ angehängt. Daher sah das Ende jeder Zeile wie ‘\r\r\n’ aus. Die Verwendung von rstrip(‘\r\n’) hätte das gesamte ‘\r\r\n’ entfernt, was ich nicht wollte. In diesem Fall habe ich stattdessen einfach die letzten beiden Zeichen abgeschnitten.
Beachten Sie, dass im Gegensatz zu Perl chomp
Funktion entfernt dies alle angegebenen Zeichen am Ende der Zeichenfolge, nicht nur eines:
>>> "Hello\n\n\n".rstrip("\n")
"Hello"
Beachten Sie, dass moderne Mac OS X-Apps \n verwenden. Nur alte Carbon-Apps, die ursprünglich für Mac OS geschrieben wurden, verwenden \r.
– Peter Hosey
9. November 2008 um 6:15 Uhr
Danke für die Klarstellung. Natürlich funktioniert der rstrip(‘\r\n’) auch in diesem Fall.
– Mike
9. November 2008 um 11:35 Uhr
Es gibt auch os.linesep
die die EOL-Sequenz für das aktuelle Betriebssystem enthält.
– EliCollins
15. August 2011 um 13:44 Uhr
Dies ist die beste Antwort: Es nur entfernt Zeilenumbrüche und macht es für die gängigsten Plattformen korrekt.
– Kevinarpe
12. Februar 2015 um 3:58 Uhr
plus +1 Für die Verwendung \n
und \r
– fechnert
28. Mai 2015 um 15:35 Uhr
Beachten Sie, dass sich rstrip nicht genau wie Perls chomp() verhält, da es den String nicht modifiziert. Das heißt in Perl:
$x="a\n";
chomp $x
ergibt sich $x
Sein "a"
.
aber in Python:
x="a\n"
x.rstrip()
bedeutet, dass der Wert von x
ist still "a\n"
. Selbst x=x.rstrip()
liefert nicht immer das gleiche Ergebnis, da alle Leerzeichen vom Ende der Zeichenfolge entfernt werden, nicht nur höchstens ein Zeilenumbruch.
Jamie
Ich könnte so etwas verwenden:
import os
s = s.rstrip(os.linesep)
Ich denke, das Problem mit rstrip("\n")
ist, dass Sie wahrscheinlich sicherstellen möchten, dass der Zeilentrenner tragbar ist. (Es wird gemunkelt, dass einige veraltete Systeme verwendet werden "\r\n"
). Das andere Problem ist das rstrip
entfernt wiederholte Leerzeichen. Hoffentlich os.linesep
enthält die richtigen Zeichen. das obige funktioniert für mich.
Dies funktioniert jedoch nicht, wenn Sie versuchen, von Benutzern übermittelte Inhalte in einer Webanwendung zu bereinigen. Der Benutzerinhalt kann aus einer beliebigen Quelle stammen und beliebige Zeilenumbruchzeichen enthalten.
– apiguy
18. Januar 2012 um 18:50 Uhr
Guter Punkt, außer dass Sie möglicherweise “fremde” Dateien (von veralteten Systemen) auf Ihrem modernen Betriebssystem verarbeiten.
– ChuckCottrill
6. Februar 2016 um 2:56 Uhr
Denken Sie auch daran, dass das Lesen einer Datei im Textmodus auf einem Windows-System ebenfalls nicht funktioniert, da das abschließende Zeichen immer in ‘\n’ umgewandelt wird.
– Verrückter Physiker
28. April 2017 um 19:55 Uhr
@MadPhysicist Sie haben Recht, dass es konvertiert wird, aber es funktioniert immer noch, weil es dasselbe ist wie rstrip('\r\n')
und rstrip()
entfernt alle Zeichen, die sich im Argument befinden.
– dtauxe
18. April 2019 um 20:06 Uhr
Flimmer
Sie dürfen verwenden line = line.rstrip('\n')
. Dadurch werden alle Zeilenumbrüche vom Ende der Zeichenfolge entfernt, nicht nur einer.
Dies funktioniert jedoch nicht, wenn Sie versuchen, von Benutzern übermittelte Inhalte in einer Webanwendung zu bereinigen. Der Benutzerinhalt kann aus einer beliebigen Quelle stammen und beliebige Zeilenumbruchzeichen enthalten.
– apiguy
18. Januar 2012 um 18:50 Uhr
Guter Punkt, außer dass Sie möglicherweise “fremde” Dateien (von veralteten Systemen) auf Ihrem modernen Betriebssystem verarbeiten.
– ChuckCottrill
6. Februar 2016 um 2:56 Uhr
Denken Sie auch daran, dass das Lesen einer Datei im Textmodus auf einem Windows-System ebenfalls nicht funktioniert, da das abschließende Zeichen immer in ‘\n’ umgewandelt wird.
– Verrückter Physiker
28. April 2017 um 19:55 Uhr
@MadPhysicist Sie haben Recht, dass es konvertiert wird, aber es funktioniert immer noch, weil es dasselbe ist wie rstrip('\r\n')
und rstrip()
entfernt alle Zeichen, die sich im Argument befinden.
– dtauxe
18. April 2019 um 20:06 Uhr
Flimmer
s = s.rstrip()
entfernt alle Zeilenumbrüche am Ende der Zeichenfolge s
. Die Zuordnung wird benötigt, weil rstrip
gibt eine neue Zeichenfolge zurück, anstatt die ursprüngliche Zeichenfolge zu ändern.
Superset: beliebige Zeichenfolge statt nur Zeilenumbruch: stackoverflow.com/questions/1038824/…
– Ciro Santilli OurBigBook.com
26. September 2015 um 21:46 Uhr
Die A+-Antwort lautet, wenn dies auf Vergessen zurückzuführen ist
open()
eine Datei mit den entsprechenden ‘newline=…’ Parameter für Ihre Plattform (universelle Newline-Unterstützung), müssen Sie ihn möglicherweise nicht explizit entfernen.– smci
19. Dezember 2017 um 4:03 Uhr