2017-05-30 27 views
1

我有一個文本文件,其中每個ID行以>開頭,下一行是一系列字符。並且在字符序列之後的下一行將是以>開始的其他ID行。但在其中的一些,而不是序列我有「Sequence unavailable」。 ID行之後的序列可以是一行或多行。 像這樣的例子:在Python中過濾奇怪的文本文件

>ENSG00000173153|ENST00000000442|64073050;64074640|64073208;64074651 
AAGCAGCCGGCGGCGCCGCCGAGTGAGGGGACGCGGCGCGGTGGGGCGGCGCGGCCCGAGGAGGCGGCGGAGGAGGGGCCGCCCGCGGCCCCCGGCTCACTCCGGCACTCCGGGCCGCTC 
>ENSG00000004139|ENST00000003834 
Sequence unavailable 

我想篩選出與「Sequence unavailable」這些ID。輸出應該是這樣的:

輸出:

>ENSG00000173153|ENST00000000442|64073050;64074640|64073208;64074651 
AAGCAGCCGGCGGCGCCGCCGAGTGAGGGGACGCGGCGCGGTGGGGCGGCGCGGCCCGAGGAGGCGGCGGAGGAGGGGCCGCCCGCGGCCCCCGGCTCACTCCGGCACTCCGGGCCGCTC 

你知道該怎麼做的蟒蛇?

+1

使用're.sub()'的正則表達式,例如['^>。+ [\ r \ n]^Sequence unavailable $'](https://regex101.com/r/vkYFd0/1)和'multiline'修飾符。 – Jan

+0

顯然,如果是FASTA格式,這些「Sequence unavailable」行是從哪裏來的呢?也許你應該從源頭上解決這個問題。也可以考慮使用'BioPython' –

+0

@Chris_Rands他們可能來自Ensembl Biomart。 –

回答

0
def main(): 
    filename = open('text.txt', 'rU').readlines() 
    filterFile(filename) 

def filterFile(SequenceFile): 
    outfile = open('outfile', 'w') 
    for line in SequenceFile: 
     if line.startswith('>'): 
      sequence = line.next() 
      if sequence.startswith('Sequence unavailable'): 
      //nothing should happen I suppose? 
      else: 
      outfile.write(line + "\n" + sequence + "\n") 

main() 

我不幸現在不能測試這個代碼,但是我把它做成了我的頭頂!請測試,並讓我知道結果是什麼,所以我可以調整代碼:-)

1

如何:

with open(filename, 'r+') as f: 
    data = f.read() 
    data = data.split('>') 
    result = ['>{}'.format(item) for item in data if item and 'Sequence unavailable' not in item] 
    f.seek(0) 
    for line in result: 
     f.write(line) 
+1

爲什麼要測試'if item'? 'item'永遠不會是'None'或者空,並且OP沒有指定如何處理空項目。但是更重要的是,在這裏使用'in'而不是平等會降低效率,因爲序列可能會很長。 –

-2

所以我並不確切地知道這些文件將有多大得到的,只是在情況下,我做它沒有在內存中的文件映射:

with open(filename) as fh: 
    with open(filename+'.new', 'w+') as fh_new: 
     for idline, geneseq in zip(*[iter(fh)] * 2): 
      if geneseq.strip() != 'Sequence unavailable': 
       fh_new.write(idline) 
       fh_new.write(geneseq) 

它通過創建一個新的文件,然後將拉鍊的是一些神奇讀兩行的文件,該idline會第一部分和geneseq第二部分。

該解決方案在計算機能力上應該相對便宜,但會創建額外的輸出文件。

+1

如果FASTA記錄有多個行,這在FASTA文件中很常見,這將失敗。 –

+1

不知道文件格式。由於原始問題中描述的格式會起作用。如果你說的是真的,這個答案確實是有缺陷的。 –

+0

維基百科有一個很好的例子+格式的定義:https://en.wikipedia.org/wiki/FASTA_format –

6

與其他答案不同,我強烈建議手動解析FASTA格式。這不是太辛苦,但有陷阱,這是完全不必要的,因爲高效,完善的測試實現存在:

使用Bio.SeqIO從BioPython;例如:

from Bio import SeqIO 

for record in SeqIO.parse(filename, 'fasta'): 
    if record.seq != 'Sequenceunavailable': 
     SeqIO.write(record, outfile, 'fasta') 

注意在'Sequenceunavailable'缺少空間:FASTA格式讀取序列將忽略空格。