【问题标题】:parse file and amend strings in python在python中解析文件并修改字符串
【发布时间】:2017-09-30 21:12:45
【问题描述】:

我有一个基因库文件 .gbk,我想从中提取某些基因。我的问题如下: 为了处理文件,每个基因座的标题必须采用特定格式,并且不在我的文件中。我想解析文件并替换标题如下:

LOCUS       NODE_1_length_393688_cov_17.8554393688 bp   DNA linear
BCT22-MAY-2017
DEFINITION  Escherichia coli strain strain.
ACCESSION   
VERSION
KEYWORDS    .
SOURCE      Escherichia coli
  ORGANISM  Escherichia coli
            Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae;
            Escherichia.
....
>>Gene data here
....

LOCUS       NODE_2_length_278889_cov_17.85545278889 bp   DNA linear
BCT22-MAY-2017
DEFINITION  Escherichia coli strain strain.
ACCESSION   
VERSION
KEYWORDS    .
SOURCE      Escherichia coli
  ORGANISM  Escherichia coli
            Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae;
            Escherichia.
....
>>Gene data here
....

LOCUS       NODE_3_length_340008_cov_17.855432340008 bp   DNA linear
BCT22-MAY-2017
DEFINITION  Escherichia coli strain strain.
ACCESSION   
VERSION
KEYWORDS    .
SOURCE      Escherichia coli
  ORGANISM  Escherichia coli
            Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae;
            Escherichia.
....
>>Gene data here
....

NODE 开头的字符串对于文件格式约定来说太长了,需要替换,所以它看起来像这样:

LOCUS       NODE_1_393688 bp   DNA linear
....
LOCUS       NODE_2_278889 bp   DNA linear
....
LOCUS       NODE_3_340008 bp   DNA linear

需要剪掉的部分不必具有相同的长度,因此移除字符串某些位置之间的所有内容的固定方法是不可行的。我使用 re.compile() 和 r.sub() 尝试了不同的方法,但到目前为止还没有成功。

任何帮助将不胜感激。 感谢您的宝贵时间!

【问题讨论】:

    标签: python bioinformatics


    【解决方案1】:

    读取第一行时,可以读取字段并规范化“节点”字段,如下:

    import operator
    
    def normalize_name(name):
        parts = name.split("_")
        return "_".join(operator.itemgetter(0, 1, 3)(parts))
    

    它将字段名称分成几部分;你得到一个清单。 然后,应用于 partsoperator.itemgetter(0, 1, 3) 函数将提取索引 0、1 和 3 处的项目,跳过 2。

    例如:

    for name in [
        "NODE_1_length_393688_cov_17.8554393688",
        "NODE_2_length_278889_cov_17.85545278889",
        "NODE_3_length_340008_cov_17.855432340008"
        ]:
        print(normalize_name(name))
    

    你得到:

    NODE_1_393688
    NODE_2_278889
    NODE_3_340008
    

    演示

    import operator
    import textwrap
    
    
    get_parts = operator.itemgetter(0, 1, 3)
    
    
    def normalize_name(name):
        parts = name.split("_")
        return "_".join(get_parts(parts))
    
    
    def normalize_header(header):
        fields = header.split()
        fields[1] = normalize_name(fields[1])
        return "{0:<11} {1} {2:<4} {3} {4}".format(*fields)
    
    
    content = textwrap.dedent("""\
    LOCUS       NODE_1_length_393688_cov_17.8554393688 bp   DNA linear
    BCT22-MAY-2017
    DEFINITION  Escherichia coli strain strain.
    ACCESSION   
    VERSION
    KEYWORDS    .
    SOURCE      Escherichia coli
      ORGANISM  Escherichia coli
                Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae;
                Escherichia.
    ....
    >>Gene data here
    ....
    """)
    
    for line in content.splitlines():
        if line.startswith("LOCUS"):
            line = normalize_header(line)
        print(line)
    

    【讨论】:

    • 好的,谢谢,听起来不错,我只需要将其实现为一个循环,该循环解析不同子目录中的多个文件并修改每个文件中以“LOCUS”开头的行的所有实例。为了做到这一点,我不需要将文本填充到整个文件本身读取的content = textwrap.dedent 函数中。 textwrap.dedent 可以吗?
    猜你喜欢
    • 2022-01-03
    • 2016-01-05
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多