2014-04-30 102 views
1

我有一個帶有製表符分隔的0-10行的巨大文件。我的問題是,如何忽略缺少空行的整行[4]?我輸入文件,如何忽略缺少數據的行

1 GRMZM2G052619_P03 10 56  a b c d e y   
2 GRMZM5G888620_P01 23 67 go:89 f g h k l m  
3 GRMZM5G886789_P02 45 89  o p r s t w 

所以,我最後的輸出應該是這樣的,

2 GRMZM5G888620_P01 23 67 go:89 f g h k l m 

import re 
f=open('input.txt','r') 
r=open('output.txt','w') 
lines=f.readlines() 
for line in lines: 
    new_list=re.split(r'\t+',line) 
    go_acc=new_list[4] 
    if go_acc != '': 
     r.writelines(line) 
f.close() 
r.close() 

我認爲某件事情是錯誤的在這條線,如果go_acc = ''!

+0

你的正則表達式'\ T +'被消耗'\ t \ t'時'線[4]'是空的,所以在那裏沒有空字符串,而是下一個字段。或者改爲使用'\ t'或者按照@falsetru的建議計算字段的數量。 –

回答

1

這裏的問題是,因爲你通過正則表達式\t+分割線,得到的字符串列表將不包含任何空字符串 - 那些「空」字段將簡單地跳過。例如,第一行將被解析爲["1", "GRMZM2G052619_P03", "10", "56", "a", "b", "c", "d", "e", "y"],因此索引4處的項目不是''而是"a"

我認爲在這種情況下更好的方法是實際嘗試匹配你要找的東西。如果,例如,在指數4的可選的是go:XX其中XX是一些數字,那麼你可以做這樣的事情:

import re 

f=open('input.txt','r') 
r=open('output.txt','w') 

for line in f.readlines(): 
    if re.search(r'go:\d+', line): 
     r.write(line + "\n") 

f.close() 
r.close() 
1

跳過線(使用continue)如果沒有完全11個字段。

for line in lines: 
    new_list=re.split(r'\t+',line) 
    if len(new_list) != 11: # <------ 
     continue   # <------ 
    go_acc=new_list[4] 
    if go_acc != '': 
     r.write(line) 
+1

不確定這是否與問題中所述的標準相同。沒有11列的事實並不一定意味着第4列不能填充(這是我對這個問題的理解)。 –

+1

在附註中,我確定'r.writelines(line)'可能不會給出所需的輸出... –

+0

@JonClements,'file.writelines'接受包含字符串的迭代。但'r.write'似乎更合適。感謝您指點。我將更新答案以使用'write'。 – falsetru