2012-07-12 113 views
1

我想知道是否有方法可以在创建新的file.txt之前找出有多少对值(开始,结束)。我的目标是检查我是否开始,结束价值超过一对,然后我想为每一对创建单独的文件。如果没有,那就把它留下。有没有一种方法可以统计我在产量中有多少值?

def searchPFAM(fname): 
    with open(fname,'rb') as f: 
     root = etree.parse(f) 
     for lcn in root.xpath("/protein/match[@dbname='PFAM']/lcn"):#find dbname =PFAM 
      try: 
       start = int(lcn.get("start"))#if it is PFAM then look for start value 
       end = int(lcn.get("end"))#if it is PFAM then also look for end value 
       yield start, end 
      except (TypeError , ValueError) as e: 
       pass 

with open('newfile.txt','w') as fileinput: 
    for start, end in searchPFAM(fname): 
     print start, end 
     if start <= end: 
      text=''.join(makeList[(start-1):(end-1)]) 
      fileinput.write(text) 
+0

不,你不能用'yield'做到这一点。 – 2012-07-12 21:22:45

回答

4

如果您想为每对一个文件,你可以做这样的事情:

for i, (start, end) in enumerate(searchPFAM(fname)): 
    print start, end 
    if start <= end: 
     with open('newfile-%s.txt' % i,'w') as fileinput: 
      text=''.join(makeList[(start-1):(end-1)]) 
      fileinput.write(text) 

希望这会有所帮助。

+0

我不知道你可以像这样解开嵌套元组。 (+1) – mgilson 2012-07-12 21:27:51

+0

@mouad非常感谢你 – 2012-07-12 21:30:14

+0

@ChadD:很高兴这是有帮助:) – mouad 2012-07-12 21:31:15

0

据我所知,没有办法做到这一点。你可以只返回一个对象的列表,并把它的长度(或更容易,将返回值转换到一个列表):

PFAMresults=list(searchPFAM) 
nresults=len(PFAMresults) 
for start,end in PFAMresults: 
    dosomething() 
+1

通过'blah = list(searchPFAM())'更容易完成,而不是修改函数的行为 – 2012-07-12 21:22:34

+0

@JonClements - 好点。我会更新。 – mgilson 2012-07-12 21:23:37

+0

@JonClements非常感谢你 – 2012-07-12 21:30:33

相关问题