gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:42:02 24 4
gpt4 key购买 nike

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

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))

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

例如:

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)

关于python - 在python中解析文件并修改字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com