2013-06-19 2 views
1

Я хочу, чтобы замечательная функция Notepad ++ «Удалить излишние пустые строки» в Python.Удаление излишков пустых строк с использованием Python

Скажем, если у меня есть файл, как этот

A 
B 


C 



D 

Я хочу

A 
B 

C 

D 

Что такое вещий способ сделать это?

Вот что я пытался

A=['a','\n','\n','\n','a','b','\n','\n','C','\n','\n','\n','\n','\n','\n','D'] 
B=[] 
count=0 
for l in range(0,len(A)): 
    if A[l]=='\n': 
     count=count+1 
    else: 
     count=0 
    if count>1: 
     if A[l+1]=='\n': 
      continue 
     else: 
      B.append('\n') 
    else: 
     if A[l]!='\n': 
      B.append(A[l]) 
print B 
+2

вы что-то пробовали? –

+0

@ RyanSaxe добавил, что я пробовал, что может быть проще для этого, учитывая, что новые строки случайны? – Rajasankar

ответ

2

Вот однострочный:

In [35]: A=['a','\n','\n','\n','a','b','\n','\n','C','\n','\n','\n','\n','\n','\n','D'] 

In [36]: B = [A[0]] + [A[i] for i in range(1, len(A)) if A[i] != '\n' or A[i-1] != '\n'] 

In [37]: B 
Out[37]: ['a', '\n', 'a', 'b', '\n', 'C', '\n', 'D'] 

В основном он пропускает символы новой строки, которые следуют за другими символами новой строки.

+0

простой и понятный. благодаря – Rajasankar

5

Убедитесь, что нет более \n\n, например:

import re 
print re.sub('\n{3,}', '\n\n', your_string, flags=re.M) 

И, используя itertools.groupby для больших файлов:

from itertools import groupby 

with open('your_file') as fin: 
    for has_value, lines in groupby(fin, lambda L: bool(L.strip())): 
     if not has_value: 
      print 
      continue 
     for line in lines: 
      print line, 
+0

это файл, хотя ... не должно быть, чтобы your_string больше напоминал 'file_name.read()'? –

+0

@ RyanSaxe возможно, но OP может это сделать, если они хотят ... –

+0

@JonClements благодарит за ответ, но в моем случае новые строки могут быть случайными, так или иначе, которые могут быть включены в ваше решение. – Rajasankar

1

Это вы что искали?

>>> def delete_surplus_blank_lines(text): 
    while '\n\n\n' in text: 
     text = text.replace('\n\n\n', '\n\n') 
    return text 

>>> text = 'a\n\n\nab\n\nC\n\n\n\n\n\nD' 
>>> print(text) 
a 


ab 

C 





D 
>>> print(delete_surplus_blank_lines(text)) 
a 

ab 

C 

D 
>>> 

Более эффективная реализация (на основе идей NPE) будет:

def delete_surplus_blank_lines(text): 
    return text[:2] + ''.join(text[index] for index in range(2, len(text)) 
           if text[index-2:index+1] != '\n\n\n') 

Однострочные этой функции достаточно легко создать с lambda:

delete_surplus_blank_lines = lambda text: return text[:2] + ''.join(text[index] for index in range(2, len(text)) if text[index-2:index+1] != '\n\n\n') 
0

У вас есть файл, поэтому давайте определим функцию с именем clean_up, чтобы очистить файл, который вы даете:

def clean_up(file_name,blanks=1): 
    with open(file_name,'r+') as f: 
     blank = 0 
     for line in f: 
      if blank < blanks: 
       if line == "\n": 
        blank += 1 
       f.write(line) 
      else: 
       blank = 0 
       if line != "\n": 
        f.write(line) 

Теперь это будет проходить через ваш файл и убедитесь, что не более blanks количество пустых строк подряд!

Смежные вопросы