使用python读取和分析fasta文件

fasta文件格式

在生物信息学中,FASTA格式(又称为Pearson格式)是一种基于文本的、用于表示核苷酸序列或氨基酸序列的格式。FASTA文件以序列标识和序列作为一个基本单元,每个基本单元分为两部分:序列标记和序列本身。第一行以‘>’开头,后面紧跟序列标记;从第二行开始,直到下一个标记行(‘>’开头行)出现,或文件末尾,这部分为序列本身。 值得注意的是,序列中的换行符应该被忽略。

fasta文件格式详细介绍请参见: 传送门1 传送门2

例如:

>seq1
ATCGATCG
>seq2
AAATTTCC
CGGG
>seq3
TAGCTAGCTAGC

上面就是一个fasta文件的基本格式,描述了3条DNA序列seq1、seq2和seq3。值得注意的是fasta文件允许在序列中存在换行,这给我们的分析工作造成了麻烦。

perl读取fasta文件

编写perl脚本读取fasta比较简单,我们可以更改perl的特殊变量$/,让"行"的概念由换行符分割改为由fasta文件中序列标记开头标识">"分割。请参考以下代码

open IN,"<",$fa or die $!;
#$/ 默认为换行符'\n',我们将其改为'>'
$/ = ">";<IN>;
while(<IN>){
        my @lines = split "\n",$_;
        my $seqName = shift @lines;
        my $seq = join '',@lines;
        $seq =~s/>\z//;
        #==============
        #这里拿到了$seqName和$seq分别为序列名和序列本身
        #请在这里编写对序列的分析代码
        #==============
        }
#为了避免对之后代码的影响,及时把$/改回来
$/ = "\n";
close IN;        

python处理fasta文件

我封装了一些处理fasta文件的函数,涉及到读取序列、滑窗操作等,在这里分享给大家。


def readFa(fa):
    '''
    @msg: 读取一个fasta文件
    @param fa {str}  fasta 文件路径
    @return: {generator} 返回一个生成器,能迭代得到fasta文件的每一个序列名和序列
    '''
    with open(fa,'r') as FA:
        seqName,seq='',''
        while 1:
            line=FA.readline()
            line=line.strip('\n')
            if (line.startswith('>') or not line) and seqName:
                yield((seqName,seq))
            if line.startswith('>'):
                seqName = line[1:]
                seq=''
            else:
                seq+=line
            if not line:break


def getSeq(fa,querySeqName,start=1,end=0):
    '''
    @msg: 获取fasta文件的某一条序列
    @param fa {str}  fasta 文件路径
    @param querySeqName {str}  序列名
    @param start {int}  截取该序列时,起始位置,可省略,默认为1
    @param end {int}  fasta 截取该序列时,最后位置,可省略,默认为该序列全长
    @return: {str} 返回找到(截取到)的序列
    '''
    if start<0: start=start+1
    for seqName,seq in readFa(fa):
        if querySeqName==seqName:
            if end!=0: returnSeq = seq[start-1:end];print(start-1)
            else: returnSeq = seq[start-1:]
            return returnSeq


def getReverseComplement(sequence):
    '''
    @msg: 获取反向互补序列
    @param sequence {str}  一段DNA序列
    @return: {str} 返回反向互补序列
    '''
        sequence = sequence.upper()
        sequence = sequence.replace('A', 't')
        sequence = sequence.replace('T', 'a')
        sequence = sequence.replace('C', 'g')
        sequence = sequence.replace('G', 'c')
        return sequence.upper()[::-1]

def getGC(sequence):
    '''
    @msg: 获取某一条序列的GC含量
    @param sequence {str}  一段DNA序列
    @return: {float} 返回GC含量
    '''
    sequence=sequence.upper()
    return (sequence.count("G")+sequence.count("C"))/len(sequence)


def readSeqByWindow(sequence,winSize,stepSize):
    '''
    @msg: 滑窗读取某一条序列
    @param sequence {str}  一段DNA序列
    @param winSize {int}  窗口大小
    @param stepSize {int}  步长
    @return: {generator}  返回一个生成器,可迭代得到该序列的每一个窗口序列
    '''
    if stepSize<=0: return False
    now = 0
    seqLen = len(sequence)
    while(now+winSize-stepSize<seqLen):
        yield sequence[now:now+winSize]
        now+=stepSize

def getGapPos(sequence):
    '''
    @msg: 获取某条序列中gap的位置
    @param sequence {str}  一段DNA序列
    @return: {list}  返回一个列表,列表中每个元素为每个gap的起始和结束位置
    '''
    Ns = {'N', 'n'}
    result = []
    i = 0
    for base in sequence:
        i += 1
        if not base in Ns: continue
        if len(result) == 0 : result.append([i,i])
        elif i - result[-1][1] == 1: result[-1][1] = i
        else: result.append([i,i])
    return result


以下是两个小例子:

fa="./sequence.fasta"
#读取一个fasta文件,并输出其中的每一条序列名,序列长度和GC含量
for seqName,seq in readFa(fa):
    seqLen = len(seq)
    GC = getGC(seq)
    print(seqName,seqLen,GC)

#读取一个fasta文件,并以1000bp为窗口、100bp为步长读取每条序列,
#计算每个窗口的GC含量,并记录在字典中
GCLst = {}
for seqName,seq in readFa(fa):
    GCLst.setdefault(seqName,[])
    for winSeq in readSeqByWindow(seq,1000,100):
        GCLst[seqName].append(getGC(winSeq))

  • 18
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用Biopython包中的SeqIO模块来读取fasta文件。首先,需要导入相应的包和模块。可以使用以下代码加载所需的包: ```python from Bio import SeqIO ``` 接下来,使用SeqIO.parse函数来读取fasta文件。该函数的第一个参数是fasta文件的路径,第二个参数是文件的格式,这里是"fasta"。可以使用以下代码来进行读取: ```python records = SeqIO.parse("path/to/fasta/file.fasta", "fasta") ``` 这样就将fasta文件中的序列读取为一个记录的列表。可以使用for循环来迭代并对每个记录进行操作。例如,可以打印每个记录的序列ID和序列: ```python for record in records: print("ID:", record.id) print("Sequence:", record.seq) ``` 除了使用Biopython的SeqIO模块,还可以使用其他一些方法来读取fasta文件并将其输出为txt文件。例如,可以使用pysam包中的FastaFile类来读取fasta文件,然后将其输出为txt文件。以下是一个示例代码: ```python import pysam as sam # 读取fasta fasta = sam.FastaFile('path/to/fasta/file.fasta') # 获取指定的碱基序列 data = fasta.fetch('NG_006669.2', 0, 42144) # 将序列输出为txt文件 with open('output.txt', 'w') as f: f.write(data) ``` 使用上述代码,将会读取fasta文件中名为'NG_006669.2'的序列,并将其输出为名为'output.txt'的txt文件。 需要注意的是,使用这些方法之前,需要确保已经安装了相应的包(如Biopython或pysam)。可以使用pip来进行安装。例如,可以使用以下命令来安装Biopython: ``` pip install biopython ``` 希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用Python脚本读取fasta文件](https://blog.csdn.net/qq_53666171/article/details/126843227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [利用Python读取fasta文件并进行一系列操作(上)](https://blog.csdn.net/yhlhhhhh/article/details/118034731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值