在python中解析文件和修改字符串

在python中解析文件和修改字符串,python,bioinformatics,Python,Bioinformatics,我有一个基因库文件.gbk,我想从中提取某些基因。我的问题如下: 为了处理文件,每个轨迹的头必须采用特定的格式,并且它不在我的文件中。我想解析文件并替换标题,如下所示: LOCUS NODE_1_length_393688_cov_17.8554393688 bp DNA linear BCT22-MAY-2017 DEFINITION Escherichia coli strain strain. ACCESSION VERSION KEYWORDS . SOUR

我有一个基因库文件.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
....
节点
开头的字符串对于文件格式约定来说太长,需要替换,因此看起来如下所示:

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))
它将字段名拆分为多个部分;你会得到一份清单。 然后,应用于部件的
操作符.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)
导入操作符
导入文本包装
get\u parts=operator.itemgetter(0,1,3)
def规格化_名称(名称):
零件=名称。拆分(“\u”)
返回“u”。加入(获取零件)
def标准化_标题(标题):
fields=header.split()
字段[1]=规范化\u名称(字段[1])
在此处返回{0:基因数据
....
""")
对于内容中的行。拆分行():
如果行开始于(“轨迹”):
行=标准化页眉(行)
打印(行)

好的,谢谢,听起来不错,我只需要将其实现为一个循环,该循环解析不同子目录中的多个文件,并修改每个文件中以“LOCUS”开头的行的所有实例。为此,我需要将文本填充到整个文件中读取的
content=textwrap.dedent
函数中,而不是将文本填充到
content=textwrap.dedent
中f、
textwrap.dedent
可以这样做吗?