- Как удалить все пустые строки в файле с помощью python?
- Удалить пустые строки из списка строк в Python
- 1. Использование filter() функция
- 2. Использование понимания списка
- 3. Использование join() с split() функция
- 4. Использование list.remove() функция
- Как удалить пустые строки из файла python
- Как удалить пустые строки с или без пробелов в Python
- 9 ответов
Как удалить все пустые строки в файле с помощью python?
Форматирование Markdown использует конечные пробелы. Удаление простого изменения этого ответа приведет к if line.rstrip(): print line строк только с пробелами и сохранению завершающих пробелов: if line.rstrip(): print line
@Thomas Томас, а почему у поля должно быть окончание \ n в файле? Если файл имеет «\ n», то я бы поставил его буквально. Если это действительно «\ n», то следующее поле будет на следующей строке. не правда ли? или я все еще скучаю по тому, что вы говорите? Если это обязательно, пожалуйста, предоставьте свое объяснение в качестве ответа, так как сложный комментарий трудно прочитать.
@ghostdog74 ghostdog74 Речь идет не о переносах строк, а о вкладках. Если вырезать вкладки в конце каждой строки, то каждая строка в таблице не будет иметь одинаковое количество столбцов.
Это не работает правильно для меня. Если у меня есть N последовательных пустых строк, это удаляет N-1. Если есть только 1 пустая строка, она не удаляется. Таким образом, пример в вопросе не будет обработан. Я использую Python на Windows, если это имеет значение.
Оператор with отлично подходит для автоматического открытия и закрытия файлов.
with open('myfile','rw') as file: for line in file: if not line.isspace(): file.write(line)
+1 за использование «с» и хорошей, питонной итерации по строкам, в дополнение к тому, чтобы не мутировать хорошие выходные строки.
Такое решение выглядит так, как будто бы у него были проблемы с буферизацией / перезаписью для любого файла, размер которого больше размера входного буфера. А если нет, может кто-нибудь объяснить, почему?
import sys with open("file.txt") as f: for line in f: if not line.isspace(): sys.stdout.write(line)
with open("file.txt") as f: print "".join(line for line in f if not line.isspace())
Я знаю, что вы спросили о Python, но ваш комментарий о Win и Linux указывает, что вы после кросс-платформенности, и Perl, по крайней мере, является кросс-платформенным как Python. Вы можете сделать это легко с помощью одной строки Perl в командной строке, не требуя никаких скриптов: perl -ne ‘print if /\S/’ foo.txt
(Я люблю Python и предпочитаю Perl в 99% случаев, но иногда мне действительно жаль, что я не могу с ним работать с командной строкой с помощью ключа -e на Perl!)
Тем не менее, должен работать следующий Python script. Если вы планируете делать это часто или для больших файлов, его также следует оптимизировать с помощью компиляции регулярных выражений.
#!/usr/bin/python import re file = open('foo.txt', 'r') for line in file.readlines(): if re.search('\S', line): print line, file.close()
Существует много способов сделать это, только один:)
Вы можете создавать сценарии командной строки с python, используя флаг -c . К сожалению, вам придется использовать несколько строк (или разделение с;) для чтения из стандартного ввода.
>>> s = """first line . second line . . third line . """ >>> print '\n'.join([i for i in s.split('\n') if len(i) > 0]) first line second line third line >>>
Это зависит от того, что означает «пустой» — это работает, только если «пустой» означает «вообще ничего». Если между второй и третьей строкой есть пробелы, произойдет сбой. Кроме того, он должен работать с файлами 🙂 Но мне нравится, что вам не нужно было импортировать регулярные выражения 🙂
Удалить пустые строки из списка строк в Python
В этом посте мы обсудим, как удалить пустые строки из списка строк в Python.
1. Использование filter() функция
Рекомендуемое решение — использовать встроенную функцию filter(function, iterable) , который строит iterator из элементов iterable для которого указано функция возвращает истину. Если функция None , предполагается тождественная функция, т. е. все элементы iterable, которые являются ложными, удаляются. Вот рабочий пример с использованием фильтров:
Вы также можете пройти len функция для фильтрации пустых строк из списка, как показано ниже:
2. Использование понимания списка
Вы также можете использовать понимание списка для удаления пустых строк из списка строк. Понимание списка состоит из выражения, за которым следует цикл for, за которым следует необязательный цикл for или оператор if, заключенные в квадратные скобки. [] . Обратите внимание, что это решение медленнее, чем подход с фильтром.
3. Использование join() с split() функция
Выражение ‘ ‘.join(iterable).split() может использоваться для фильтрации пустых значений из итерации. ‘ ‘.join(list) эффективно объединить список строк, разделенных пробелом. затем split() Функция вызывается для результирующей строки, которая возвращает список строк, в которых последовательные пробелы считаются одним разделителем.
4. Использование list.remove() функция
The list.remove(«») удаляет только первое вхождение пустой строки из списка. Чтобы удалить все вхождения пустой строки из списка, вы можете воспользоваться тем фактом, что она вызывает ValueError когда он не может найти указанный элемент в списке. Идея состоит в том, чтобы многократно вызывать remove() функционировать до тех пор, пока не возникнет ValueError исключение. Это показано ниже:
Как удалить пустые строки из файла python
Удалить пустые строки можно считав все строки из файла, отфильтровать пустые, и записать новый файл.
cat file.txt # foobar # # fizzbazz # helloworld! # # python # # hexlet # with open('file.txt') as f: lines = f.readlines() non_empty_lines = (line for line in lines if not line.isspace()) with open('new_file.txt', 'w') as n_f: n_f.writelines(non_empty_lines) cat new_file.txt # foobar # fizzbazz # helloworld! # python # hexlet
Как удалить пустые строки с или без пробелов в Python
У меня есть большая строка, которую я разделил на строки новой строки. Как удалить все строки, которые пусты, (только пробелы)? псевдокод:
for stuff in largestring: remove stuff that is blank
Один лайнер для удаления пустых строк (без пробелов) — это . Заголовок вопроса может быть изменен на «Удалить пустые строки с пробелами только в Python».
9 ответов
Использование регулярного выражения:
if re.match(r'^\s*$', line): # line is empty (has only the following: \t\n\r and whitespace)
filtered = filter(lambda x: not re.match(r'^\s*$', x), original)
Решение Gimel, с последующим повторным соединением текста, дает гораздо лучшую производительность. Я сравнил два решения на небольшом тексте (10 строк, если 3 были пустыми). Вот результаты: регулярное выражение: 1000 loops, best of 3: 452 us per loop ; объединение, разделение и удаление: 100000 loops, best of 3: 5.41 us per loop
Попробуйте найти список и string.strip() :
>>> mystr = "L1\nL2\n\nL3\nL4\n \n\nL5" >>> mystr.split('\n') ['L1', 'L2', '', 'L3', 'L4', ' ', '', 'L5'] >>> [line for line in mystr.split('\n') if line.strip() != ''] ['L1', 'L2', 'L3', 'L4', 'L5']
Я также пробовал regexp и список решений, а список один быстрее.
Вот мое решение (по предыдущим ответам):
text = "\n".join([ll.rstrip() for ll in original_text.splitlines() if ll.strip()])
Изменить: Ничего себе, я думаю, что опустить очевидное не все.
lines = bigstring.split() lines = [line for line in lines if line.strip()]
Это будет работать для строк = [‘Line \ n’, ‘\ n’, ‘Line \ n’], но ввод будет «Line \ n \ nLine \ n».
@Walter: На самом деле, если бы вы использовали ‘Line \ n \ nLine \ n’.split (), как и следовало ожидать, все было бы прекрасно.
Если вы не хотите попробовать регулярное выражение (что вам нужно), вы можете использовать это:
Повторите это несколько раз, чтобы убедиться, что пустая строка не указана. Или цепочки команд:
Вы можете использовать регулярное выражение, например. «Повторите несколько строк, чтобы быть уверенным» — это не очень хорошая идея, когда вы кодируете, так как вы можете оставить вещи нерешенными или тратить время на выполнение чего-то большего, чем необходимо.
+1 к регулярному выражению, но в качестве ленивого хака (или если импорт модуля регулярного выражения слишком медленный) вы можете цепочкой заменить операторы: s.replace(‘\n\n’,’\n’).replace(‘\n\n’,’\n’) Проверено на 3.6.
Похоже, что порядок выполнения слева направо, но я не смог найти его нигде после краткого поиска, поэтому может быть небезопасно полагаться на него при замене с учетом порядка.