What's a quick one-liner to remove empty lines from a python string?

PythonStringLine Endings

Python Problem Overview


I have some code in a python string that contains extraneous empty lines. I would like to remove all empty lines from the string. What's the most pythonic way to do this?

Note: I'm not looking for a general code re-formatter, just a quick one or two-liner.

Thanks!

Python Solutions


Solution 1 - Python

How about:

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

where text is the string with the possible extraneous lines?

Solution 2 - Python

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

Edit2:

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

I think that's my final version. It should work well even with code mixing line endings. I don't think that line with spaces should be considered empty, but if so then simple s.strip() will do instead.

Solution 3 - Python

LESSON ON REMOVING NEWLINES and EMPTY LINES WITH SPACES

"t" is the variable with the text. You will see an "s" variable, its a temporary variable that only exists during the evaluation of the main set of parenthesis (forgot the name of these lil python things)

First lets set the "t" variable so it has new lines:

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

Note there is another way to set the varible using triple quotes

somevar="""
   asdfas
asdf

  asdf
    
  asdf

asdf
""""

Here is how it looks when we view it without "print":

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

To see with actual newlines, print it.

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

of empty
line
even some with spaces

like that


okay now what?

COMMAND REMOVE ALL BLANK LINES (INCLUDING SPACES):

So somelines newlines are just newlines, and some have spaces so they look like new lines

If you want to get rid of all blank looking lines (if they have just newlines, or spaces as well)

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

NOTE: that strip in t.strip().splitline(True) can be removes so its just t.splitlines(True), but then your output can end with an extra newline (so that removes the final newline). The strip() in the last part s.strip("\r\n").strip() and s.strip() is what actually removes the spaces in newlines and newlines.

COMMAND REMOVE ALL BLANK LINES (BUT NOT ONES WITH SPACES):

Technically lines with spaces should NOT be considered empty, but it all depends on the use case and what your trying to achieve.

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

** NOTE ABOUT THAT MIDDLE strip **

That middle strip there, thats attached to the "t" variable, just removes the last newline (just as the previous note has stated). Here is how it would look like without that strip being there (notice that last newline)

With 1st example (removing newlines and newlines with spaces)

>>> 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).

With 2nd example (removing newlines only)

>>> 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).

The END!

Solution 4 - Python

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

are equivalent to

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

and might be useful for readability

Solution 5 - Python

By using re.sub function

re.sub(r'^$\n', '', s, flags=re.MULTILINE)

Solution 6 - Python

Here is a one line solution:
print("".join([s for s in mystr.splitlines(True) if s.strip()]))

Solution 7 - Python

This code removes empty lines (with or without whitespaces).

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

Solution 8 - Python

IMHO shortest and most Pythonic would be:

str(textWithEmptyLines).replace('\n\n','')

Solution 9 - Python

This one will remove lines of spaces too.

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

Solution 10 - Python

using regex re.sub(r'^$\n', '', somestring, flags=re.MULTILINE)

Solution 11 - Python

And now for something completely different:

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'

Episode 2:

This one doesn't work on 1.5 :-(

BUT not only does it handle universal newlines and blank lines, it also removes trailing whitespace (good idea when tidying up code lines IMHO) AND does a repair job if the last meaningful line is not terminated.

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)

Solution 12 - Python

expanding on ymv's answer, you can use filter with join to get desired string,

"".join(filter(str.strip, sample_string.splitlines(True)))

Solution 13 - Python

I wanted to remove a bunch of empty lines and what worked for me was:

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

I went with 2 since that covered the \r\n. I did want a few empty rows just to make my formatting look better so in those cases I had to use:

print("    \n"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrew WagnerView Question on Stackoverflow
Solution 1 - PythonLawrence JohnstonView Answer on Stackoverflow
Solution 2 - PythonWojciech BederskiView Answer on Stackoverflow
Solution 3 - PythonkossbossView Answer on Stackoverflow
Solution 4 - PythonymvView Answer on Stackoverflow
Solution 5 - PythonfbesshoView Answer on Stackoverflow
Solution 6 - PythonjasonleonhardView Answer on Stackoverflow
Solution 7 - PythonrfedorovView Answer on Stackoverflow
Solution 8 - PythonNariman HuseynovView Answer on Stackoverflow
Solution 9 - PythonpeterdeminView Answer on Stackoverflow
Solution 10 - PythonShahnawaz ShaikhView Answer on Stackoverflow
Solution 11 - PythonJohn MachinView Answer on Stackoverflow
Solution 12 - PythonSufiyan GhoriView Answer on Stackoverflow
Solution 13 - PythonBenView Answer on Stackoverflow