我有一个基因库文件.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()的不同方法,但到目前为止还没有成功。
任何帮助都将受到高度赞赏。 谢谢你的时间!
答案 0 :(得分:1)
当您阅读第一行时,您可以阅读字段并规范化“节点”字段,如下所示:
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)