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

Viewed 93967

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!

13 Answers

How about:

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

where text is the string with the possible extraneous lines?

"\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.

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

Here is a one line solution:

print("".join([s for s in mystr.splitlines(True) if s.strip()]))

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

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

IMHO shortest and most Pythonic would be:

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

This one will remove lines of spaces too.

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

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

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)

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

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

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"
Related