2046 Stimmen

Wie entferne ich einen nachgestellten Zeilenumbruch?

Wie entferne ich das letzte Zeichen einer Zeichenkette, wenn es ein Zeilenumbruch ist?

"abc\n"  -->  "abc"

4 Stimmen

Superset: beliebige Zeichenkette anstelle von nur newline: stackoverflow.com/questions/1038824/

9 Stimmen

Die A+-Antwort lautet, wenn dies darauf zurückzuführen ist, dass vergessen wurde open() eine Datei mit dem entsprechenden 'newline=...' Parameter für Ihre Plattform (universelle Unterstützung von Zeilenumbrüchen), müssen Sie ihn möglicherweise nicht explizit entfernen.

20voto

ingydotnet Punkte 2206

Rstrip macht in vielerlei Hinsicht nicht dasselbe wie chomp. Lesen Sie http://perldoc.perl.org/functions/chomp.html und sehen, dass chomp in der Tat sehr komplex ist.

Mein Hauptargument ist jedoch, dass chomp höchstens 1 Zeilenende entfernt, während rstrip so viele entfernt, wie es kann.

Hier können Sie sehen, wie rstrip alle Zeilenumbrüche entfernt:

>>> 'foo\n\n'.rstrip(os.linesep)
'foo'

Eine sehr viel genauere Annäherung an die typische Verwendung von Perl chomp kann mit re.sub erreicht werden, etwa so:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'

2 Stimmen

Hut ab, Sie sind der Einzige, der auf dieses sehr wichtige Detail hingewiesen hat. Wie jedoch bereits jemand weiter oben angemerkt hat, funktioniert die Verwendung von os.linesep nicht, wenn Sie Dateien von einem anderen System lesen. Dies könnte ein wenig mehr Arbeit in Python erfordern, um das Ende der Zeile tatsächlich zu überprüfen.

19voto

Carlos Valiente Punkte 882

Vorsichtig mit "foo".rstrip(os.linesep) : Damit werden nur die Zeilenumbrüche für die Plattform, auf der Ihr Python ausgeführt wird, gechipt. Stellen Sie sich vor, Sie chippen die Zeilen einer Windows-Datei unter Linux, zum Beispiel:

$ python
Python 2.7.1 (r271:86832, Mar 18 2011, 09:09:48) 
[GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, sys
>>> sys.platform
'linux2'
>>> "foo\r\n".rstrip(os.linesep)
'foo\r'
>>>

Verwenden Sie "foo".rstrip("\r\n") stattdessen, wie Mike oben sagt.

1 Stimmen

Zu beachten ist auch, dass nicht maximal ein Zeilenumbruch entfernt wird, sondern alle Zeilenumbrüche, im Gegensatz zu chomp .

19voto

minopret Punkte 4684

Eine Beispiel in der Dokumentation von Python verwendet einfach line.strip() .

Perls chomp Funktion entfernt eine Zeilenumbruchsequenz am Ende einer Zeichenkette nur dann, wenn sie tatsächlich vorhanden ist.

Hier ist, wie ich plane, das in Python zu tun, wenn process ist konzeptionell die Funktion, die ich benötige, um mit jeder Zeile dieser Datei etwas Sinnvolles anzustellen:

import os
sep_pos = -len(os.linesep)
with open("file.txt") as f:
    for line in f:
        if line[sep_pos:] == os.linesep:
            line = line[:sep_pos]
        process(line)

2 Stimmen

Endlich eine Antwort, die sie nur beseitigt einmal (wie der eigentliche Chomp...) und ist OS portabel!

13voto

import re

r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)

2 Stimmen

Dadurch wird auch der Tabulator-Whitespace entfernt, was in der ursprünglichen Frage nicht verlangt wurde. ( Aufgrund der \t Zeichen )

13voto

Andrew Grimm Punkte 73882

Ich programmiere nicht in Python, aber ich bin auf ein FAQ at python.org befürwortet S.rstrip(" \r\n ") für Python 2.2 oder höher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X