2012-04-15 36 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