Как удалить завершающий символ новой строки?
Проблема: Как удалить последний символ строки, если это символ новой строки?
Я пытаюсь удалить последний символ из строки, если он является символом новой строки (\n
). Например, из строки "abc\n"
я хочу получить "abc"
.
Мой код выглядит следующим образом:
string = "abc\n"
# здесь должен быть код для удаления последнего символа, если это \n
Как правильно реализовать эту логику? Заранее благодарен за помощь!
5 ответ(ов)
Я бы сказал, что "питоничный" способ получения строк без завершающих символов новой строки — это использование метода splitlines()
.
Вот пример:
>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
Этот метод возвращает список строк, деля исходную строку по символам новой строки, и при этом автоматически удаляет эти символы, так что у вас остаются только чистые строки.
Канонический способ удалить символы перевода строки (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"
Важно отметить, что метод 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.
Вы можете использовать что-то вроде этого:
import os
s = s.rstrip(os.linesep)
Проблема с rstrip("\n")
в том, что вы, вероятно, захотите убедиться, что разделитель строк будет портируемым. (Некоторые устаревшие системы, как ходят слухи, используют "\r\n"
). Еще одна ловушка заключается в том, что rstrip
удаляет повторяющиеся пробелы. Надеюсь, os.linesep
будет содержать правильные символы. У меня этот способ сработал.
Вы можете использовать line = line.rstrip('\n')
. Это удалит все символы новой строки в конце строки, а не только один.
Сохранение списка в файл с помощью Python с учетом переносов строк
Почему используется string.join(list), а не list.join(string)?
Создание словаря с помощью генератора словарей
Как получить полный путь к директории текущего файла?
Найти все файлы с расширением .txt в директории на Python