Что такое быстрый однострочный способ удаления пустых строк из строки Python?

У меня есть код в строке Python, который содержит посторонние пустые строки. Я хотел бы удалить все пустые строки из строки. Какой самый питонический способ сделать это?

Примечание. Я не ищу общий форматировщик кода, просто быстрый одно- или двухстрочный.

Спасибо!


person Andrew Wagner    schedule 17.07.2009    source источник
comment
Пожалуйста, разрешите неясности. Что такое набор терминаторов строки? Пустое означает, что не содержит символов или содержит только пробелы?   -  person John Machin    schedule 17.07.2009
comment
Хорошая точка зрения! Для моих целей все строки были строго пустыми (без пробелов), а все разделители строк были \n. Тем не менее, будущие посетители, которые ищут это, вероятно, захотят более общую версию, которая вырезает строки, даже если в них есть пробелы, и может обрабатывать любой стиль окончания строки.   -  person Andrew Wagner    schedule 18.07.2009


Ответы (13)


Как насчет:

text = os.linesep.join([s for s in text.splitlines() if s])

где text это строка с возможными посторонними строками?

person Lawrence Johnston    schedule 17.07.2009
comment
+1 к этому за использование splitlines(), который обрабатывает различия платформ в окончаниях строк. Однако есть ли преимущество в if len(s), а не просто в if s? - person Jarret Hardie; 17.07.2009
comment
Не то, что я знаю из. Просто у меня вылетело из головы, что Python считает пустые строки ложными. Я просто удалил его. - person Lawrence Johnston; 17.07.2009
comment
Используйте if s.strip() для обработки пробелов как пустой строки. - person Paul; 17.07.2009
comment
Вы можете удалить квадратные скобки, чтобы использовать выражение генератора вместо понимания списка. Или сделайте так: '\n'.join(filter(None, text.splitlines())) -- хотя у меня всегда были смешанные чувства по поводу filter(None, ..). - person John Fouhy; 17.07.2009
comment
text = os.linesep.join([s for s в text.splitlines() if s]) будет лучше обрабатывать различия платформ - person luc; 17.07.2009
comment
В моем случае я также хотел удалить строки, содержащие только пробелы: os.linesep.join([s for s in text.splitlines() if s.strip()]) - person Eldamir; 19.12.2013
comment
Большое спасибо, Эдамир, os.linesep.join([s for s in text.splitlines() if s.strip()]) хорошо справляется со своей задачей - person rony thomas; 19.01.2020
comment
Зачем использовать весь этот длинный код со списком вместо простого .replace('\n\n','')? - person Nairum; 30.08.2020
comment
@AlexeiMarinichenko Поскольку вы предполагаете окончание строк в стиле UNIX, тогда как этот пример также может обрабатывать стиль Windows (например, \r\n) - person Benjamin Crawford Ctrl-Alt-Tut; 06.10.2020

"\n".join([s for s in code.split("\n") if s])

Редактировать2:

text = "".join([s for s in code.splitlines(True) if s.strip("\r\n")])

Я думаю, что это мой окончательный вариант. Он должен хорошо работать даже с окончаниями строк кода. Я не думаю, что эту строку с пробелами следует считать пустой, но если это так, то вместо нее подойдет простой s.strip().

person Wojciech Bederski    schedule 17.07.2009
comment
Я использую ваш код, это работает, но когда я использую _lines = "".join([s for s in strings.splitlines(True) if s.strip()]), это работает. Итак, почему вы используете \r\n в .strip()? - person Sukma Saputra; 06.12.2020

УРОК ПО УДАЛЕНИЮ НОВЫХ СТРООК и ПУСТЫХ СТРООК С ПРОБЕЛАМИ

«t» — это переменная с текстом. Вы увидите переменную «s», это временная переменная, которая существует только во время оценки основного набора круглых скобок (забыл название этих маленьких вещей python)

Сначала давайте установим переменную «t», чтобы у нее были новые строки:

>>> t='hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n'

Обратите внимание, что есть еще один способ установить переменную с помощью тройных кавычек.

somevar="""
   asdfas
asdf

  asdf

  asdf

asdf
""""

Вот как это выглядит, когда мы рассматриваем его без «печати»:

>>> t
'hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n' 

Чтобы увидеть с реальными переводами строк, распечатайте его.

>>> print t
hi there here is
a big line

of empty
line
even some with spaces

like that


okay now what?

КОМАНДА УДАЛИТЬ ВСЕ ПУСТЫЕ СТРОКИ (ВКЛЮЧАЯ ПРОБЕЛЫ):

Таким образом, некоторые новые строки — это просто новые строки, а в некоторых есть пробелы, поэтому они выглядят как новые строки.

Если вы хотите избавиться от всех пустых строк (если у них есть только новые строки или пробелы)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

OR:

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

ПРИМЕЧАНИЕ: эта полоса в t.strip().splitline(True) может быть удалена, так что это просто t.splitlines(True), но тогда ваш вывод может заканчиваться дополнительной новой строкой (чтобы удалить последнюю новую строку). Strip() в последней части s.strip("\r\n").strip() и s.strip() - это то, что фактически удаляет пробелы в новых строках и новых строках.

КОМАНДА УДАЛИТЬ ВСЕ ПУСТЫЕ СТРОКИ (НО НЕ С ПРОБЕЛАМИ):

Технически строки с пробелами НЕ следует считать пустыми, но все зависит от варианта использования и того, чего вы пытаетесь достичь.

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?

** ПРИМЕЧАНИЕ ОБ ЭТОЙ СРЕДНЕЙ ПОЛОСЕ **

Эта средняя полоса, прикрепленная к переменной «t», просто удаляет последнюю новую строку (как указано в предыдущем примечании). Вот как это будет выглядеть без этой полосы (обратите внимание на последнюю новую строку)

С 1-м примером (удаление новых строк и новых строк с пробелами)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?
.without strip new line here (stackoverflow cant have me format it in).

Со 2-м примером (удаление только новых строк)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?
.without strip new line here (stackoverflow cant have me format it in).

Конец!

person kossboss    schedule 11.06.2014

filter(None, code.splitlines())
filter(str.strip, code.splitlines())

эквивалентны

[s for s in code.splitlines() if s]
[s for s in code.splitlines() if s.strip()]

и может быть полезно для удобства чтения

person ymv    schedule 17.07.2009
comment
Мне очень нравится улучшенная читаемость, однако вы не можете просто поменять местами одно на другое, так как filter возвращает не строку, а объект фильтра. По крайней мере, в Python 3 это так. См. этот связанный вопрос подробнее. - person domsson; 04.01.2018

С помощью функции re.sub

re.sub(r'^$\n', '', s, flags=re.MULTILINE)
person fbessho    schedule 20.12.2017
comment
Этот ответ действительно хорош, потому что в нем упоминается флаг re.MULTILINE. - person Alexey; 06.03.2019
comment
Обратите внимание, что это решение оставит последнюю пустую строку (если это последняя строка в строке) нетронутой; шаблон, соответствующий последнему: '\n^$' - person crollywood; 19.03.2020

Вот однострочное решение:

print("".join([s for s in mystr.splitlines(True) if s.strip()]))
person jasonleonhard    schedule 26.09.2017
comment
Деньги! Только что использовал это. Работал как чемпион. - person MarkS; 20.05.2019

ИМХО самым коротким и самым Pythonic будет:

str(textWithEmptyLines).replace('\n\n','')
person Nariman Huseynov    schedule 05.01.2020

Этот код удаляет пустые строки (с пробелами или без них).

import re    
re.sub(r'\n\s*\n', '\n', text, flags=re.MULTILINE)
person rfedorov    schedule 01.07.2019

Это также удалит строки пробелов.

re.replace(u'(?imu)^\s*\n', u'', code)

person peterdemin    schedule 17.07.2009
comment
в питоне нет re.replace - person Harry Lee; 04.05.2016

используя регулярное выражение re.sub(r'^$\n', '', somestring, flags=re.MULTILINE)

person Shahnawaz Shaikh    schedule 15.06.2021

А сейчас нечто соверешнно другое:

Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import string, re
>>> tidy = lambda s: string.join(filter(string.strip, re.split(r'[\r\n]+', s)), '\n')
>>> tidy('\r\n   \n\ra\n\n   b   \r\rc\n\n')
'a\012   b   \012c'

Эпизод 2:

На 1.5 не работает :-(

НО он не только обрабатывает универсальные символы новой строки и пустые строки, но также удаляет конечные пробелы (хорошая идея для очистки строк кода, ИМХО) И выполняет работу по восстановлению, если последняя значимая строка не завершается.

import re
tidy = lambda c: re.sub(
    r'(^\s*[\r\n]+|^\s*\Z)|(\s*\Z|\s*[\r\n]+)',
    lambda m: '\n' if m.lastindex == 2 else '',
    c)
person John Machin    schedule 17.07.2009

расширяя ответ ymv, вы можете использовать filter с join, чтобы получить нужную строку,

"".join(filter(str.strip, sample_string.splitlines(True)))
person Sufiyan Ghori    schedule 02.01.2019

Я хотел удалить кучу пустых строк, и у меня сработало следующее:

if len(line) > 2:
    myfile.write(output)

Я выбрал 2, так как это покрывало \r\n. Мне нужно было несколько пустых строк, чтобы мое форматирование выглядело лучше, поэтому в этих случаях мне приходилось использовать:

print("    \n"
person Ben    schedule 02.08.2019