2013-06-19 28 views
1

我想Python中的Notepad ++的奇妙功能「刪除剩餘空行」。使用Python刪除多餘的空白行

說,如果我有這樣的

A 
B 


C 



D 

文件我想

A 
B 

C 

D 

什麼是這樣做的Python的方式?

這裏是我試過

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