Wie Entferne ich einen trailing newline?
Was ist das Python äquivalent von Perl - chomp
Funktion, die entfernt das Letzte Zeichen eines string, wenn es ein Zeilenumbruch ist?
- Obermenge: jede Zeichenkette, statt nur Zeilenvorschub:
stackoverflow.com/questions/1038824/... - Die A+ - Antwort ist, wenn diese fällig war, zu vergessen, um
open()
eine Datei mit den entsprechenden 'newline=...', parameter für Ihre Plattform (universal newline support), können Sie nicht brauchen, um explizit zu entfernen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, die Methode
rstrip()
(siehe doc Python 2 und Python 3)Python ' s
rstrip()
Methode Streifen alle Arten von trailing-whitespaces werden standardmäßig nicht nur ein newline als Perl hat mitMampf
.Streifen nur Zeilenumbrüche:
Dort sind auch die Methoden
lstrip()
undstrip()
:\n
für Zeilenumbrüche genauso wie Unix. (Vor OS X, MacOS habe\r
als line-Trenner, aber das endete vor 10 Jahren.)strip
,rstrip
,lstrip
wird als eine Liste von Zeichen, kein string. So'abcdedcba'.strip("abc")
gibtdef
, nichtcdedcba
!\n
erhalten Sie noch\r
.\n
bilden, wenn Sie aus der Datei gelesen werden. Dann, Ihr Programm, die Arbeit mit Streichern wird es nie sehen\r
Zeichen.text.rstrip(os.linesep)
würde nicht funktionieren in einer OS-unabhängigen Weg, dies zu erreichen?.strip()
nicht verändert die Zeichenfolge (hat wahrscheinlich etwas zu tun mit immutable strings). Wenn nicht in der Befehlszeile, Sie wollen"string = string.strip()"
Und ich würde sagen, der "pythonic" Weg, um Linien ohne trailing newline " - Zeichen ist splitlines().
str.splitlines()
leckereien wie Zeilenumbrüche viele Charaktere (nicht nur\r
,\n
)Den kanonischen Weg zum strip end-of-line - (EOL -) Zeichen zu verwenden, die string rstrip () - Methode entfernen Sie nachgestellte \r oder \n ist. Hier sind Beispiele für Mac -, Windows-und Unix EOL-Zeichen.
Verwendung von "\r\n " als parameter zu rstrip bedeutet, dass es Streifen aus nachgestellte Kombination von '\r' oder '\n'. Das ist, warum es funktioniert in allen drei Fällen vor.
Diese nuance zählt in seltenen Fällen. Beispielsweise habe ich einmal zu Bearbeiten hatte, eine text-Datei, die enthalten eine HL7-Nachricht. Der HL7-standard verlangt ein abschließendes '\r' als EOL-Zeichen. Der Windows-Rechner, auf dem ich mit dieser Nachricht angehängt hatte seine eigene '\r\n' EOL-Zeichen. Daher am Ende jeder Zeile sah aus wie '\r\r\n'. Mit rstrip('\r\n') hätte sich die gesamte '\r\r\n', das ist nicht das, was ich wollte. In diesem Fall habe ich einfach abgeschnitten die letzten zwei Zeichen statt.
Beachten Sie, dass im Gegensatz zu Perl -
chomp
Funktion, wird dieser Streifen alle angegebenen Zeichen am Ende des Strings, nicht nur eine:os.linesep
enthält die EOL-Sequenz für das aktuelle OS.\n
und\r
\r
im Eingang, weil Python nutzt universal-newlines-Modus standardmäßig ('\n'
,'\r'
oder'\r\n'
übersetzt werden'\n'
beim Lesen). Wenn Sie möchten, zu berücksichtigen, Unicode-Zeilenumbrüche; siehestr.splitlines()
.Beachten Sie, dass rstrip nicht handeln genauso wie Perl chomp (), weil es nicht die Zeichenfolge ändern. Das ist in Perl:
Ergebnisse in
$x
wird"a"
.aber in Python:
bedeutet, dass der Wert der
x
ist noch"a\n"
. Auchx=x.rstrip()
nicht immer das gleiche Ergebnis, wie es entfernt alle whitespace-Zeichen am Ende der Zeichenfolge nicht nur eine newline am meisten.Ich könnte so etwas wie dieses:
Ich denke, das problem mit
rstrip("\n")
ist, dass Sie wahrscheinlich wollen, um sicherzustellen, dass die line separator tragbar ist. (einige veraltete Systeme sind angeblich zu verwenden"\r\n"
). Der andere Punkt ist, dassrstrip
Streifen aus wiederholten Leerzeichen. Hoffentlichos.linesep
enthält die richtigen Zeichen. die oben genannten arbeiten für mich.rstrip('\r\n')
undrstrip()
Streifen alle Zeichen, die im argument.Können Sie verwenden
line = line.rstrip('\n')
. Dieser Streifen alle Zeilenumbrüche vom Ende der Zeichenfolge, nicht nur eine.entfernt alle Zeilenumbrüche am Ende des Strings
s
. Die Zuordnung ist erforderlich, darstrip
gibt einen neuen string, anstatt eine änderung der ursprünglichen Zeichenfolge.Diese würde exakt nachzubilden perl chomp (minus Verhalten auf arrays) für "\n" zeilenabschluss:
(Anmerkung: es ist nicht zu ändern string "in place"; es nicht entfernen zusätzlicher Leerzeichen; ist \r\n-Konto)
können Sie mit strip:
demo:
oder Sie immer geekier mit regexps 🙂
Spaß haben!
.replace('\n|\r', '')
?import re
re.sub('\n|\r', '', '\nx\n\r\n')
==>'x'
.Vorsichtig mit
"foo".rstrip(os.linesep)
: Das wird nur chomp das newline Zeichen für die Plattform, wo Sie Ihre Python ausgeführt wird. Stell dir vor, du bist chimping die Zeilen einer Windows-Datei, unter Linux, zum Beispiel:Verwenden
"foo".rstrip("\r\n")
statt, wie Mike sagt, oben.chomp
.Einer Beispiel in der Python-Dokumentation verwendet einfach
line.strip()
.Perl -
chomp
Funktion entfernt einen Zeilenumbruch der Sequenz vom Ende einer Zeichenfolge nur, wenn es wirklich da ist.Hier ist, wie ich Plane zu tun, dass in Python, wenn
process
ist konzeptionell die Funktion, die ich brauche, um etwas nützliches zu tun, um jede Zeile aus dieser Datei:rstrip nicht das gleiche tun wie chomp, auf so vielen Ebenen. Lesen http://perldoc.perl.org/functions/chomp.html und sehen, dass chomp ist sehr Komplex, in der Tat.
Aber mein Hauptpunkt ist, dass chomp entfernt, höchstens 1 Linie endend, in der Erwägung, dass rstrip wird, entfernen Sie so viele wie Sie können.
Hier sehen Sie rstrip das entfernen aller Zeilenumbrüche:
Eine viel engere Annäherung der typischen Perl chomp-Auslastung kann erreicht werden, mit der re.sub, wie diese:
Ich nicht das Programm in Python, aber ich kam über ein FAQ an python.org befürworten S. rstrip("\r\n") python 2.2 oder höher.
workaround-Lösung für den speziellen Fall:
wenn der neue-Zeile-Zeichen ist das Letzte Zeichen (wie der Fall mit die meisten Datei-Eingänge), dann wird für jedes element in der Auflistung können Sie den index wie folgt:
slice Ihre neue-Zeile-Zeichen.
Wenn Ihre Frage ist, zu bereinigen, alle Zeilenumbrüche in mehrzeiligen str-Objekt (oldstr), können Sie es aufgeteilt in eine Liste nach dem Trennzeichen '\n' und dann kommen Sie mit dieser Liste in eine neue, str(newstr).
newstr = "".join(oldstr.split('\n'))
Ich finde es bequem zu haben in der Lage sein, um die chomped Linien über den in-iterator, parallel zum Weg, um die un-chomped Zeilen aus einer Datei-Objekt. Sie können dies mit dem folgenden code:
Beispiel für die Nutzung:
operator.methodcaller
undmap
(itertools.imap
auf Py2) drücken Sie können diese Arbeit an der C-Schicht, die Vermeidung von Python-level-generator-code (und somit läuft ein bisschen schneller, obwohl-zugegeben-I/O-overhead ist wahrscheinlich, Maske, kleine Gewinne):for line in map(operator.methodcaller('rstrip', '\r\n'), infile):
. Es könnte noch ausgeklammert, wiedef chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it)
.Bin ich sprudeln meinen regulären Ausdruck basiert Antwort von einer, die ich weiter oben geschrieben, in den Kommentaren von anderen beantworten. Ich denke, mit
re
ist deutlicher, mehr explizite Lösung für dieses problem alsstr.rstrip
.Wenn Sie möchten, entfernen Sie eine oder mehrere nachfolgende newline chars:
Wenn Sie entfernen möchten newline chars überall (nicht nur nachgestellt):
Wenn Sie möchten, entfernen Sie nur 1-2 nachgestellte newline-Zeichen (D. H.,
\r
,\n
,\r\n
,\n\r
,\r\r
,\n\n
)Habe ich das Gefühl, was die meisten Menschen wirklich wollen, hier, ist zu entfernen, nur eine auftreten von ein abschließendes newline-Zeichen, entweder
\r\n
oder\n
und nichts mehr.(Die
?:
zu schaffen, ist eine non-capturing-group.)(Dies ist übrigens nicht was
'...'.rstrip('\n', '').rstrip('\r', '')
tut, das kann nicht sein, klar, für andere das stolpern über diesen thread.str.rstrip
Streifen als viele nachfolgende Zeichen wie möglich, damit ein string wiefoo\n\n\n
Ergebnis wäre ein false positive vonfoo
in der Erwägung, dass Sie vielleicht wollte, um zu bewahren die andere Zeilenumbrüche nach dem Strippen einen einzigen trailing eine.)r'\r?\n$'
. Wahrscheinlich effizienter, da regex-engines haben eine härtere Zeit zu optimieren-Wechsel. Beachten Sie auch, dass, wenn Sie gehen zu tun, das viele Male, aber deutlich schneller (vor allem, wenn Sie die Vermischung mit anderenre
verwendet) zure.compile
den Ausdruck einmal vorne, dann verwenden Sie diesub
- Methode der regex kompiliert Objekt; Modul-Funktionen sind Python-Ebene und lassen einen cache für kompilierte regexes ersten (Erstellung/Zwischenspeichern, wenn Sie fehlt), dann rufen die passende Methode; - skipping, die lookup hilft.\n
direkt, möchten Sie vielleicht die Verwendung\Z
über$
(oder gleichen Sie einfach\r?$
, da$
implizit kann mit nur vor dem newline am Ende einer Zeichenkette (string).Sieht es aus wie es gibt nicht die eine perfekte analog zur perl -chomp. Insbesondere rstrip nicht in den Griff-multi-newline-Zeichen Trennzeichen wie
\r\n
. Allerdings splitlines hat wie schon hier.Folgende meine Antwort auf eine andere Frage, die Sie kombinieren können beitreten und splitlines zu entfernen/ersetzen alle Zeilenumbrüche aus einem string
s
:Den folgenden entfernt genau eine nachfolgende newline (wie chomp würde, glaube ich). Vorbei
True
alskeepends
argument splitlines behalten die Trennzeichen. Dann, splitlines erneut aufgerufen, um entfernen Sie die Klammern einfach auf die Letzte "line":Verwenden Sie einfach :
oder
Brauchen Sie nicht alle diese komplizierten Sachen
"\r\n"
Zum Beispiel:' spacious \n\r\n\r \n\n'.rstrip()
produziert' spacious'
Gibt es drei Arten von Zeilenenden, die wir normalerweise begegnen:
\n
,\r
und\r\n
. Einen eher einfachen regulären Ausdruck inre.sub
, nämlichr"\r?\n?$"
ist in der Lage, um Sie alle zu fangen.(Und wir gotta catch 'em all, hab ich Recht?)
Mit dem letzten argument, beschränken wir die Anzahl der vorkommen ersetzt werden, um eine, die Nachahmung von chomp zu einem gewissen Grad. Beispiel:
... wo
a == b == c
istTrue
.rstrip("\r\n")
ist ein catch-all. Versuchenprint(text_2.rstrip('\r\n'))
.str.rstrip()
löst das problem. Es hängt davon ab, welche Bedürfnisse Sie haben. Diese Lösung ist speziell für die Fälle, wenn Sie benötigen, entfernen Sie einfach die Letzte"\n"
,"\r"
oder"\r\n"
aber nicht alle von Ihnen (wenn es mehrere"\n"
im string).re.sub(r"\r?\n?$", "", text_1, 1)
zurück"hellothere\n\n"
undtext_1.rstrip("\r\n")
zurück"hellothere"
die eine andere Zeichenfolge.str.strip()
ist ein catch-all ist manchmal das problem.Dies funktioniert sowohl für windows und linux (etwas teuer mit re sub wenn Sie auf der Suche für nur re-Lösung)
re.search
wo Sie müssen nurre.sub
?Wenn Sie besorgt über Geschwindigkeit (sagen wir, Sie haben eine laaange Liste von strings) und Sie wissen, dass die Art der newline-char, string-slicing ist tatsächlich schneller als rstrip. Einen kleinen test, um dies zu veranschaulichen:
Ausgabe:
method1
Sie sind einfach abhacken das Letzte Zeichen, egal was, inmethod2
die.rstrip()
zuerst überprüft, ob das Ende der Zeichenfolge enthält unerwünschte Zeichen und hackt Sie ab, nur wenn einige gefunden wurden. Bitte implementieren Sie einige Kontrollkästchen für Zeichen inmethod1
- und test-agin!Einen catch-all:
rstrip
nicht regulären Ausdruck."hi|||\n\n".rstrip("\r|\n")
zurück"hi"