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

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

+1568
источник поделиться
28 ответов

Попробуйте метод rstrip() (см. doc 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'
+1716
источник

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

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']
+153
источник

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

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

>>> "Hello\n\n\n".rstrip("\n")
"Hello"
+141
источник

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

$x="a\n";

chomp $x

приводит к $x "a".

но в Python:

x="a\n"

x.rstrip()

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

+98
источник

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

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

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

+48
источник

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

+40
источник
s = s.rstrip()

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

+33
источник

Это будет точно реплицировать perl chomp (минус поведение на массивах) для терминатора строки "\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 в учетной записи)

+28
источник

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

line = line.strip()

демо:

>>> "\n\n hello world \n\n".strip()
'hello world'
+26
источник
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

или вы всегда можете получить geekier с регулярными выражениями:)

получайте удовольствие!

+25
источник

Осторожно с "foo".rstrip(os.linesep): это будет только chomp символы новой строки для платформы, на которой выполняется ваш Python. Представьте, что вы подбираете строки файла Windows под Linux, например:

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

Используйте "foo".rstrip("\r\n") вместо этого, как сказал Майк выше.

+19
источник

пример в документации по Python просто использует line.strip().

Функция Perl chomp удаляет одну последовательность разрыва строки из конца строки, только если она действительно есть.

Вот как я планирую сделать это в Python, если process концептуально является функцией, которая мне нужна, чтобы сделать что-то полезное для каждой строки из этого файла:

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)
+19
источник

rstrip не делает то же самое, что и chomp, на стольких уровнях. Прочитайте http://perldoc.perl.org/functions/chomp.html и убедитесь, что chomp очень сложный.

Однако, мой основной момент состоит в том, что chomp удаляет не более 1 строки, тогда как rstrip удаляет столько, сколько может.

Здесь вы можете увидеть, что rstrip удаляет все строки новой строки:

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

Более близкое приближение типичного использования Perl chomp может быть выполнено с помощью re.sub, например:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'
+16
источник

Я не программирую в Python, но я наткнулся на FAQ на python.org, выступая за S.rstrip( "\r\n" ) для python 2.2 или новее.

+13
источник
import re

r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)
+10
источник

Если ваш вопрос состоит в том, чтобы очистить все разрывы строк в объекте с несколькими строками str (oldstr), вы можете разбить его на список в соответствии с разделителем '\n', а затем соединить этот список с новой str (newstr).

newstr = "".join(oldstr.split('\n'))

+8
источник

Мне удобно иметь возможность получать перебранные строки через итератор, параллельно тому, как вы можете получить строки с неперехваченными линиями из файлового объекта. Вы можете сделать это со следующим кодом:

def chomped_lines(it):
    return map(operator.methodcaller('rstrip', '\r\n'), it)

Использование образца:

with open("file.txt") as infile:
    for line in chomped_lines(infile):
        process(line)
+8
источник

обходное решение для специального случая:

если символ новой строки является последним символом (как в случае с большинством входов файлов), то для любого элемента в коллекции вы можете индексировать следующее:

foobar= foobar[:-1]

чтобы вырезать символ новой строки.

+7
источник

Похоже, что нет идеального аналога для perl chomp. В частности, rstrip не может обрабатывать многосимвольные разделители новой строки, такие как \r\n. Однако разделительные линии делают , как указано здесь. Следуя моему ответу на другой вопрос, вы можете объединить объединить и разделительные линии, чтобы удалить/заменить все новые строки в строке s:

''.join(s.splitlines())

Следующее удаляет ровно одну завершающую новую строку (как я полагаю, chomp). Передача True в качестве аргумента keepends для разделенных линий сохраняет разделители. Затем снова вызывается splitline, чтобы удалить разделители только на последней "строке":

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''
+7
источник

Я поднимаю свой ответ на основе регулярных выражений от одного, который я опубликовал ранее в комментариях к другому ответу. Я думаю, что использование re является более явным более явным решением этой проблемы, чем str.rstrip.

>>> import re

Если вы хотите удалить один или несколько завершающих символов новой строки:

>>> re.sub(r'[\n\r]+$', '', '\nx\r\n')
'\nx'

Если вы хотите удалить символы новой строки везде (а не только трейлинг):

>>> re.sub(r'[\n\r]+', '', '\nx\r\n')
'x'

Если вы хотите удалить только 1-2 конечных символа новой строки (т.е. \r, \n, \r\n, \n\r, \r\r, \n\n)

>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r\n')
'\nx\r'
>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r')
'\nx\r'
>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n')
'\nx'

Я чувствую, что большинство людей действительно хочет здесь, - это удалить только одно появление символа новой строки, либо \r\n либо \n и ничего больше.

>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n\n', count=1)
'\nx\n'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n\r\n', count=1)
'\nx\r\n'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n', count=1)
'\nx'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n', count=1)
'\nx'

(" ?: - создать группу, не связанную с захватом).

(Кстати, это не то, что '...'.rstrip('\n', '').rstrip('\r', ''), что может быть непонятным для других, преследующих этот поток str.rstrip как можно больше символов завершающего символа, поэтому строка, подобная foo\n\n\n приведет к ложному положительному результату foo тогда как вы, возможно, захотите сохранить другие символы новой строки после удаления одного завершающего символа.)

+6
источник

Используя str. rstrip([chars])

Здесь мы говорим Официальная полная документация Нажмите здесь

+5

Просто используйте:

line = line.rstrip("\n")

или

line = line.strip("\n")

Вам не нужен какой-либо из этих сложных вещей

+4
источник
>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'
+4
источник

Существует три типа окончаний строк, которые мы обычно встречаем: \n, \r и \r\n. Достаточно простое регулярное выражение в re.sub, а именно r"\r?\n?$", способно их поймать.

(И мы должны поймать их всех, я прав?)

import re

re.sub(r"\r?\n?$", "", the_text, 1)

С последним аргументом мы ограничиваем количество замещений замененными на одно, имитируя chomp до некоторой степени. Пример:

import re

text_1 = "hellothere\n\n\n"
text_2 = "hellothere\n\n\r"
text_3 = "hellothere\n\n\r\n"

a = re.sub(r"\r?\n?$", "", text_1, 1)
b = re.sub(r"\r?\n?$", "", text_2, 1)
c = re.sub(r"\r?\n?$", "", text_3, 1)

... где a == b == c True.

+3
источник

Это будет работать как для windows, так и для linux (бит дорогостоящий с повторным подключением, если вы ищете только новое решение)

import re 
if re.search("(\\r|)\\n$", line):
    line = re.sub("(\\r|)\\n$", "", line)

+2
источник

Если вас беспокоит скорость (скажем, у вас есть список строк), и вы знаете природу новой строки char, нарезка строк на самом деле быстрее, чем rstrip. Небольшой тест, чтобы проиллюстрировать это:

import time

loops = 50000000

def method1(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string[:-1]
    t1 = time.time()
    print('Method 1: ' + str(t1 - t0))

def method2(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string.rstrip()
    t1 = time.time()
    print('Method 2: ' + str(t1 - t0))

method1()
method2()

Вывод:

Method 1: 3.92700004578
Method 2: 6.73000001907
+1
источник
    s = '''d2234 d45564 d223098 d50923 PETY_354_d3456 d76533
d2635 PETY_354 d88593 d324623 HUI_6478_d3553d35626'''
    s.replace(" ", "")
    >>'d2234d45564d223098d50923PETY_354_d3456d76533\nd2635PETY_354d88593d324623HUI_6478_d3553d35626'

    import string
    s.translate({ord(c): None for c in string.whitespace})
>>'d2234d45564d223098d50923PETY_354_d3456d76533d2635PETY_354d88593d324623HUI_6478_d3553d35626'
0
источник

Ухватить все:

line = line.rstrip('\r|\n')
-1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос