首页 > 解决方案 > 使用 Python 删除 FASTA 中的重复序列

问题描述

如果之前有人问过这个问题,我深表歉意,但我已经搜索了好几天,在 Python 中找不到解决方案。

我有一个大的 fasta 文件,包含标题和序列。

>cavPor3_rmsk_tRNA-Leu-TTA(m) range=chrM:2643-2717 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GTTAAGGTGGCAGAGCCGGTAATTGCATAAAATTTAAGACTTTACTCTCA
GAGGTTCAACTCCTCTCCTTAACAC

>cavPor3_rmsk_tRNA-Gln-CAA_ range=chrM:3745-3815 5'pad=0 3'pad=0 strand=- repeatMasking=none
AGAGGGTCATAAAGGTTATGGGGTTGGCTTGAAACCAGCTTTAGGGGGTT
CAATTCCTTCCTCTCT

>cavPor3_rmsk_tRNA-Ser-TCA(m) range=chrM:6875-6940 5'pad=0 3'pad=0 strand=- repeatMasking=none
AGAGGGTCATAAAGGTTATGGGGTTGGCTTGAAACCAGCTTTAGGGGGTT
CAATTCCTTCCTCTCT

这是文件外观的一小部分。我只想保留第一个条目(标题和序列),如果你可以看到最后两个条目,序列是相同的。

输出将如下所示:

>cavPor3_rmsk_tRNA-Leu-TTA(m) range=chrM:2643-2717 5'pad=0 3'pad=0 strand=+ repeatMasking=none
GTTAAGGTGGCAGAGCCGGTAATTGCATAAAATTTAAGACTTTACTCTCA
GAGGTTCAACTCCTCTCCTTAACAC

>cavPor3_rmsk_tRNA-Gln-CAA_ range=chrM:3745-3815 5'pad=0 3'pad=0 strand=- repeatMasking=none
AGAGGGTCATAAAGGTTATGGGGTTGGCTTGAAACCAGCTTTAGGGGGTT
CAATTCCTTCCTCTCT

问题是 FASTA 文件的大小超过了 1 GB。我找到了通过基于重复 ID 删除重复项或使用 bash 来解决此问题的方法,但遗憾的是我无法在我的计算机上执行此操作。此任务是针对研究项目,而不是家庭作业或任务。

预先感谢您的帮助!

标签: pythonduplicatesbiopythonfasta

解决方案


这是从这里复制的:Remove Redundant Sequences from FASTA file in Python

使用 Biopython,但适用于标题为以下内容的 fasta 文件:

'> header' 类型见FAsta Format Wiki

from Bio import SeqIO
import time

start = time.time() 

seen = []
records = []

for record in SeqIO.parse("INPUT-FILE", "fasta"):  
    if str(record.seq) not in seen:
        seen.append(str(record.seq))
        records.append(record)


#writing to a fasta file
SeqIO.write(records, "OUTPUT-FILE", "fasta")
end = time.time()

print(f"Run time is {(end- start)/60}") 


正如 MattMDo 建议的那样,使用集合而不是列表更快:

seen = set()
records = []

for record in SeqIO.parse("b4r2.fasta", "fasta"):  
    if record.seq not in seen:
        seen.add(record.seq)
        records.append(record)

我有一个更长的使用 argparser 但它的速度较慢,因为如果需要计数序列可以发布它


推荐阅读