2015-07-20 49 views
1

我有一些軟件打印出來的數據,它給了我太多額外的新行。我試圖消除所有多餘的換行字符,同時保持以下數據的列格式:使用python從文本文件中除去一個新行字符

[atRA]_0 [Cyp26A1_mRNA]_0  
1 0 0 

1.999 0 0 

2.998 0 0 

3.997 0 0 

4.996 0 0 

此代碼根本不起作用

def remove_newline_from_copasi_report(self,copasi_data): 
    with open(copasi_data) as f: 
     lines=[] 
     data = f.read() 
     return data.rstrip() 

鑑於此代碼刪除所有新生產線和廢墟格式:

def remove_newline_from_copasi_report(self,copasi_data): 
    with open(copasi_data) as f: 
     lines=[] 
     data = f.read() 
     return data.replace('\n','') 

有沒有人知道如何從我的文本文件的每一行刪除一個換行符?

感謝

+0

'data.replace('\ n \ n','')'也許? – Lynn

回答

2

可以遍歷該文件對象使用if line.strip(),不需要將所有內容讀入內存和th恩試圖取代,只是做它,你遍歷:

lines = "".join([line for line in f if line.strip()]) 
print(lines) 

[atRA]_0 [Cyp26A1_mRNA]_0  
1 0 0 
1.999 0 0 
2.998 0 0 
3.997 0 0 
4.996 0 0 

要只存儲線在每次只迭代的循環應用相同的邏輯,或使列表中的根exp和ietarte超過認爲:

for line in f: 
    if line.strip(): 
     print(line) 
+0

但是現在你在內存中創建整個列表,你可以'join()'生成器表達式: ''「.join(line for line in line in line.strip())' – Finwood

+0

@Finwoodm no,python會在內部創建一個列表,如果您傳遞一個生成器來加入,所以它實際上效率較低,OP可以遍歷文件對象在一次循環中使用相同的邏輯來獲得一行,我只使用了列表comp和join來顯示輸出。使用上面的代碼它比read.split效率更高,然後是''\ n'.join(行如果len(line)> 0)的線段。' –

+0

哦,我不知道_that_。很高興知道! :-) – Finwood

2

只要尋找雙新線單一的新線替換它們:

In [1]: data = """[atRA]_0 [Cyp26A1_mRNA]_0  
    ...: 1 0 0 
    ...: 
    ...: 1.999 0 0 
    ...: 
    ...: 2.998 0 0 
    ...: 
    ...: 3.997 0 0 
    ...: 
    ...: 4.996 0 0""" 

In[2]: print(data.replace('\n\n', '\n')) 
[atRA]_0 [Cyp26A1_mRNA]_0  
1 0 0 
1.999 0 0 
2.998 0 0 
3.997 0 0 
4.996 0 0 
+0

完美,謝謝 – CiaranWelsh

3
lines = data.split('\n') 
data = '\n'.join(line for line in lines if len(line) > 0) 

應該工作

+0

我更喜歡這個解決方案,因爲它不僅限於'\ n \ n' – karthikr

相關問題