Как я могу удалить завершающий перевод строки в Python? - PullRequest
1498 голосов
/ 08 ноября 2008

Что такое Python-эквивалент функции Perl chomp, которая удаляет последний символ строки, если она является новой строкой?

Ответы [ 26 ]

1614 голосов
/ 08 ноября 2008

Попробуйте метод rstrip() (см. Документ Python 2 и Python 3 )

>>> 'test string\n'.rstrip()
'test string'

Метод Python rstrip() удаляет все виды конечных пробелов по умолчанию, а не только одну новую строку, как это делает Perl с chomp.

>>> 'test string \n \r\n\n\r \n\n'.rstrip()
'test string'

Для удаления только новых строк:

>>> 'test string \n \r\n\n\r \n\n'.rstrip('\n')
'test string \n \r\n\n\r '

Существуют также методы lstrip() и strip():

>>> 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'
149 голосов
/ 09 ноября 2008

И я бы сказал, что "питонный" способ получить строки без завершающих символов новой строки - это splitlines ().

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
136 голосов
/ 09 ноября 2008

Канонический способ удаления символов конца строки (EOL) заключается в использовании метода string rstrip (), удаляющего любые завершающие символы \ r или \ n. Вот примеры символов Mac, Windows и Unix EOL.

>>> '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'

Использование '\ r \ n' в качестве параметра для rstrip означает, что он удалит любую завершающую комбинацию '\ r' или '\ n'. Вот почему это работает во всех трех случаях выше.

Этот нюанс имеет значение в редких случаях. Например, однажды мне пришлось обработать текстовый файл, содержащий сообщение HL7. Стандарт HL7 требует завершающего символа «\ r» в качестве символа EOL. Машина Windows, на которой я использовал это сообщение, добавила свой собственный символ '\ r \ n' EOL. Поэтому конец каждой строки выглядел как '\ r \ r \ n'. Использование rstrip ('\ r \ n') привело бы к удалению всего \ r \ r \ n ', а это не то, что я хотел. В этом случае я просто обрезал последние два символа.

Обратите внимание, что в отличие от функции chomp в Perl, она удалит все указанные символы в конце строки, а не только один:

>>> "Hello\n\n\n".rstrip("\n")
"Hello"
98 голосов
/ 28 ноября 2008

Обратите внимание, что rstrip не работает точно так же, как Perl chomp (), потому что он не изменяет строку. То есть в Perl:

$x="a\n";

chomp $x

приводит к $x, являющемуся "a".

но в Python:

x="a\n"

x.rstrip()

будет означать, что значение x равно still "a\n". Даже x=x.rstrip() не всегда дает один и тот же результат, поскольку он удаляет все пробелы с конца строки, а не только одну новую строку.

49 голосов
/ 07 марта 2010

Я мог бы использовать что-то вроде этого:

import os
s = s.rstrip(os.linesep)

Я думаю, что проблема с rstrip("\n") в том, что вы, вероятно, захотите убедиться, что разделитель строк является переносимым. (по некоторым слухам, некоторые устаревшие системы используют "\r\n"). Другая проблема в том, что rstrip удалит повторяющиеся пробелы. Надеюсь, os.linesep будет содержать правильные символы. вышесказанное работает для меня.

39 голосов
/ 13 мая 2013

Вы можете использовать line = line.rstrip('\n'). Это удалит все новые строки с конца строки, а не только один.

32 голосов
/ 09 марта 2015
s = s.rstrip()

удалит все символы новой строки в конце строки s. Назначение необходимо, потому что rstrip возвращает новую строку вместо изменения исходной строки.

26 голосов
/ 01 октября 2015

Это будет точно повторять chomp perl (минус поведение массивов) для терминатора строки "\ n":

def chomp(x):
    if x.endswith("\r\n"): return x[:-2]
    if x.endswith("\n") or x.endswith("\r"): return x[:-1]
    return x

(Примечание: он не изменяет строку «на месте»; он не удаляет лишние конечные пробелы; учитывает \ r \ n)

26 голосов
/ 21 ноября 2014

Вы можете использовать полосу:

line = line.strip()

демо

>>> "\n\n hello world \n\n".strip()
'hello world'
25 голосов
/ 01 марта 2012
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

или вы всегда можете стать более умным с помощью регулярных выражений :) 1002 *

веселись!

...