繁体   English   中英

解析文件并修改python中的字符串

[英]parse file and amend strings in python

我有一个基因库文件 .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() 尝试了不同的方法,但到目前为止还没有成功。

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

读取第一行时,可以读取字段,对“节点”字段进行归一化,如下:

import operator

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

它将字段名称分成几部分; 你得到一个清单。 然后,应用于部件operator.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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM