один лайнер для удаления пустых строк из файла в python?

Я ищу один liner, который удалит все пустые строки из файла в python. эквивалент python для -> grep -v '^$' file_name > file_name

 lines = [i for i in open(file_path) if i[:-1]] 

Если требуется записать в другой файл, вы можете использовать file_object.writelines(lines) с открывающим файлом для записи.

Следующее – не однострочный, но выполняет работу и легко читается:

 for line in open(filename): line = line.rstrip() if line != '': print line 

Это выводит результат на стандартный вывод. Редактировать этот код тривиально для печати в другом месте.

Если вы настаиваете, довольно легко преобразовать его в однострочный:

 ''.join(l for l in open(filename) if l.rstrip()) 

Без петлевого:

 open('dst','w').write(re.sub('\n\s*\n+','\n', open('src').read())) 

filter(bool, map(lambda x:x.rstrip(), open(filename)))

Если вам нужен настоящий однострочный:

 python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),' 

который может использоваться в вашей оболочке как:

 cat input.txt | python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),' > output.txt 

Если вы хотите обрабатывать большие файлы, не беспокоясь об ошибках из-за памяти, вы должны сделать это в цикле:

 import sys for line in sys.stdin: if line[:-1]: sys.stdout.write(line) 

Если у вас должен быть один лайнер, вот один и тот же код в одной строке:

 for _ in (sys.stdout.write(line) for line in sys.stdin if line[:-1]): pass 

EDITED включил подсказку agf.

 os.system("grep -v '^$' file_name > file_name") 

Модуль fileinput имеет опцию 'inplace', предназначенную для редактирования файлов за один шаг. Пока файл читается, стандартный вывод временно перенаправляется во входной файл.

Вот один лайнер, который будет делать то, что вы хотите (сделано в bash):

 python -c $'import sys, re, fileinput\nfor line in fileinput.input("file_name", inplace=True): sys.stdout.write( re.sub(r"^\\n$", "", line) )'