2012-04-15 67 views
3

所以我有一个包含这个文件:循环线路上使用Python

SequenceName 4.6e-38 810..924 
SequenceName_FGS_810..924 VAWNCRQNVFWAPLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH 
SequenceName 1.6e-38 887..992 
SequenceName_GYQ_887..992 PLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH 

我想我的程序读取只包含这些蛋白质序列的线条。到现在为止,我得到了这一点,这将跳过第一行并读取第二个:

handle = open(filename, "r") 
handle.readline() 
linearr = handle.readline().split() 
handle.close() 

fnamealpha = fname + ".txt" 
handle = open(fnamealpha, "w") 
handle.write(">%s\n%s\n" % (linearr[0], linearr[1])) 
handle.close() 

但它仅处理第一序列,我需要它来处理一个包含序列的每一行,所以我需要一个循环, 我该怎么做? 保存到txt文件的部分也非常重要,所以我需要找到一种方法来将这两个目标结合起来。 我与上面的代码输出为:

>SequenceName_810..924 
VAWNCRQNVFWAPLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH 

回答

10

好吧,我想我理解你的问题 - 你想遍历文件中的行,对吧?但只有序列中的第二行 - 具有蛋白质序列的那一行 - 很重要,对吗?这里是我的建议:

# context manager `with` takes care of file closing, error handling 
with open(filename, 'r') as handle: 
    for line in handle: 
     if line.startswith('SequenceName_'): 
      print line.split() 
      # Write to file, etc. 

我的理由是,你是只在与SequenceName_###开头的行感兴趣。

+2

“readlines”是邪恶的!它将在内存中分配一个行数组。使用生成像readline代替。在这种情况下计算生物学似乎是这样很重要 – 2012-04-15 04:46:06

+0

是的,我看到了你对其他答案的评论,并且看到了这个问题,看起来好像readlines是邪恶的,或者至少是多余的,我会编辑我的答案,谢谢你的提示! – modocache 2012-04-15 04:47:25

+0

没问题,在同一张纸上使用“xrange”而不是“range”,因为“range”确实在内存中分配了一个完整的数组,而“xrange”只是生成器的版本 – 2012-04-15 04:49:30

1

使用readlines,这一切扔进for循环。

with open(filename, 'r') as fh: 
    for line in fh.readlines: 
     # do processing here 

#do processing here部分,您可以准备另一行行列表以写入其他文件。 (使用with处理所有正确的关闭和确定。)

+0

此建议如何帮助他跳过其他所有行?此外,代码是错误的。这不是你称之为“readlines”的方式,也不是调用readlines。 – agf 2012-04-15 04:38:25

+0

从我读到的内容来看,他希望它跳过特定顺序的行。为此,他可以将逻辑放在'for'循环中。另外,是的,这是你如何称'readlines'。它需要附加到文件句柄。请参阅:http://docs.python.org/library/stdtypes.html?highlight=readline#file.readlines – 2012-04-15 04:42:26

+2

调用“readlines”将创建文件中所有行的数组。如果文件很大,这可能是一个问题,最好使用一个生成器。 – 2012-04-15 04:42:46