20

Как удалить завершающий символ новой строки?

10

Проблема: Как удалить последний символ строки, если это символ новой строки?

Я пытаюсь удалить последний символ из строки, если он является символом новой строки (\n). Например, из строки "abc\n" я хочу получить "abc".

Мой код выглядит следующим образом:

string = "abc\n"
# здесь должен быть код для удаления последнего символа, если это \n

Как правильно реализовать эту логику? Заранее благодарен за помощь!

5 ответ(ов)

1

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

Вот пример:

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']

Этот метод возвращает список строк, деля исходную строку по символам новой строки, и при этом автоматически удаляет эти символы, так что у вас остаются только чистые строки.

1

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

>>> '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-машине, на которой я использовал это сообщение, к этому было добавлено собственное EOL \r\n. Поэтому конец каждой строки выглядел как '\r\r\n'. Использование rstrip('\r\n') удалило бы все '\r\r\n', что не было бы правильным. В этом случае я просто срезал последние два символа.

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

>>> "Hello\n\n\n".rstrip("\n")
"Hello"
1

Важно отметить, что метод rstrip в Python не работает точно так же, как функция chomp() в Perl, поскольку он не изменяет исходную строку. В Perl:

$x = "a\n";

chomp $x;

результатом будет строка $x, равная "a".

Однако в Python:

x = "a\n"

x.rstrip()

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

x = "a\n"
x = x.rstrip('\n')  # Удалит только символ новой строки

Таким образом, после выполнения этого кода x будет равно "a", как и в случае с chomp() в Perl.

0

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

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

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

0

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь