美文网首页
Python 脚本之统计基因组文件中染色体长度及N碱基数目

Python 脚本之统计基因组文件中染色体长度及N碱基数目

作者: 中午打个盹 | 来源:发表于2020-07-06 17:25 被阅读0次

    模块介绍

    re模块

    re模块是Python中的正则表达式调用模块,在python中,通过将正则表达式内嵌集成re模块,程序员们可以直接调用来实现正则匹配。

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    正则表达式的大致匹配过程是:

    1. 依次拿出表达式和文本中的字符比较,
    2. 如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
    3. 如果表达式中有量词或边界,这个过程会稍微有一些不同。

    re模块所支持的方法有如下:

    #返回pattern对象
    pattern=re.compile(string[,flag])
    #以下为匹配所用函数
    1 re.match(pattern, string[, flags])
    2 re.search(pattern, string[, flags])
    3 re.split(pattern, string[, maxsplit])
    4 re.findall(pattern, string[, flags])
    5 re.finditer(pattern, string[, flags])
    6 re.sub(pattern, repl, string[, count])
    7 re.subn(pattern, repl, string[, count])

    其中,pattern为匹配模式,由re.compile生成,例如:pattern = re.compile(r'hello')

    r'hello' 中 'r' 是python原生字符串自带的转义字符,等同于反斜杠 ''。

    参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,如 re.I | re.M。可选值有:

    • re.I(全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)
    • re.M(全拼:MULTILINE): 多行模式,改变'^'和'$'的行为
    • re.S(全拼:DOTALL): 点任意匹配模式,改变'.'的行为
    • re.L(全拼:LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
    • re.U(全拼:UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
    • re.X(全拼:VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释

    注:以上七个方法中的flags同样是代表匹配模式的意思,如果在pattern生成时已经指明了flags,那么在下面的方法中就不需要传入这个参数了。

    1. re.match(pattern, string[, flags])

    这个方法将会从string(我们要匹配的字符串)的开头开始,尝试匹配pattern,一直向后匹配,如果遇到无法匹配的字符,立即返回None,如果匹配未结束已经到达string的末尾,也会返回None。两个结果均表示匹配失败,否则匹配pattern成功,同时匹配终止,不再对string向后匹配。

    2. re.search(pattern, string[, flags])

    search方法与match方法极其类似,区别在于match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配,match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None。同样,search方法的返回对象同样match()返回对象的方法和属性。

    3. re.split(pattern, string[, maxsplit])

    按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

    4. re.findall(pattern, string[, flags])

    搜索string,以列表形式返回全部能匹配的子串。

    5. re.finditer(pattern, string[, flags])

    搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。

    6. re.sub(pattern, repl, string[, count])

    使用repl替换string中每一个匹配的子串后返回替换后的字符串。
    当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。
    当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
    count用于指定最多替换次数,不指定时全部替换。

    7. re.subn(pattern, repl, string[, count])

    返回 (sub(repl, string[, count]), 替换次数)。

    strip()方法

    描述

    Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

    注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
    语法

    str.strip([chars])

    参数

    chars -- 移除字符串头尾指定的字符序列。

    返回值

    返回移除字符串头尾指定的字符生成的新字符串。

    实例

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    str = "123abcrunoob321"
    print (str.strip( '12' ))  # 字符序列为 12
    

    以上实例输出结果如下:

    3abcrunoob3

    脚本正文

    #!/usr/bin/python3.6
    # 用途:用于统计基因组文件中每条染色体长度及N碱基的数目
    # 创建人:lyr
    # 创建时间: 2019/10/28
    import re
    input = '/PATH/GENOME.fa'
    output = 'fasta_stat.txt'
    dict = {}
    dict2 = {}
    
    with open(input, 'r') as read_fas:
        for line in read_fas:
            if line[0] == '>':
                key = line.strip('[>\n]')
                dict[key] = 0
                dict2[key] = 0
            else:
                value = line.strip()
                seq_len = len(value)
                dict[key] += seq_len
                N_sum = len(re.findall('[nN]',value))
                dict2[key] += N_sum
    read_fas.close()
    
    basic_stat = open(output, 'w')
    print('chr length',dict, file = basic_stat)
    print('Total N(bp):',dict2, file = basic_stat)
    

    参考
    https://www.cnblogs.com/chengege/p/11190782.html
    https://www.runoob.com/python/att-string-strip.html

    相关文章

      网友评论

          本文标题:Python 脚本之统计基因组文件中染色体长度及N碱基数目

          本文链接:https://www.haomeiwen.com/subject/qffgqktx.html