2014-04-30 28 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