我的脚本的主要目标是将 genbank 文件转换为 gtf 文件。我的问题与从所有CDS 条目中提取 CDS 信息(基因、位置(例如,CDS 2598105..2598404)、codon_start、protein_id、db_xref)有关。我的脚本应该打开/解析一个 genbank 文件,从每个 CDS 条目中提取信息,并将信息写入另一个文件。该脚本不会产生任何错误,但只会在终止之前从 genbank 文件的前 1/2 写入信息。这是我的代码...
import Bio
from Bio import GenBank
from Bio import SeqIO
fileList = ['data_files/e_coli_ref_BA000007.2.gb']
qualies = ['gene', 'protein_id', 'db_xref']
#######################################################DEFINITIONS################################################################
def strip_it(string_name):
stripers = ['[', ']', '\'', '"']
for s in stripers:
string_name = string_name.replace(s, '')
string_name = string_name.lstrip()
return string_name
def strip_it_attributes(string_name):
stripers = ['[', ']', '\'', '"', '{', '}',',']
for s in stripers:
string_name = string_name.replace(s, '')
string_name = string_name.lstrip()
string_name = string_name.replace(': ', '=')
string_name = string_name.replace(' ', ';')
return string_name
#---------------------------------------------------------------------------------------------------------------------------------
#######################################################################################################################
for f in fileList:
nameOut = f.replace('gb', 'gtf')
with open(f, 'r') as inputFile:
with open(nameOut, 'w') as outputFile:
record = next(SeqIO.parse(f, 'genbank'))
seqid = record.id
typeName = 'Gene'
source = 'convert_gbToGFT.py'
start_codon = 'NA'
attribute = 'NA'
featureCount = 0
for f in record.features:
print(f.type)
string = ''
if f.type == 'CDS':
dic = {}
CDS = record.features[featureCount]
position = strip_it(str(CDS.location))
start = position.split(':')[0]
stop = position.split(':')[1].split('(')[0]
strand = position.split(':')[1].split('(')[1].replace(')', '')
score = '.'
for q in qualies:
if q in CDS.qualifiers:
if q not in dic:
dic[q] = ''
dic[q] = strip_it(str(CDS.qualifiers[q]))
attribute = strip_it_attributes(str(dic))
if 'codon_start' in CDS.qualifiers:
start_codon = str(int(str(CDS.qualifiers['codon_start'][0]))-1) #need string when finished so it can be added to variable 'string'
string = '\t'.join([seqid, source, typeName, start, stop, score, strand, start_codon, attribute])
if attribute.count(';') == 2:
outputFile.write(string + '\n')
featureCount+=1
#---------------------------------------------------------------------------------------------------------------------------------
输出文件的最后一行是:
BA000007.2 convert_gbToGFT.py Gene 2598104 2598404 . + 0 protein_i d=BAB36052.1;db_xref=GI:13362097;gene=ECs2629
基因ECs2629的位置出现在genbank文件的第36094行,但是这个文件的总行数是73498。我已经重新下载了很多次文件,看看是否有下载问题,我已经目测了文件(我觉得它没有错)。我还在另一个同样大的 genbank 文件上尝试了这个脚本,并遇到了相同的问题。
任何人都可以就为什么不解析整个 genbank 文件提供一些建议,我如何修改我的代码以消除这个问题,或者指出另一个可能的解决方案?
(您可以从此处查看 genbank 文件的格式:http ://www.ncbi.nlm.nih.gov/Sitemap/samplerecord.html ),但是,我正在使用大肠杆菌genbank 文件(大肠杆菌O157 :H7 str. Sakai DNA,完整基因组),可在此处找到: http ://www.ncbi.nlm.nih.gov/nuccore/BA000007.2
我正在使用以下内容:Centos 6.7、Python 3.4.3 :: Anaconda 2.3.0(64 位)、Biopython 1.66
[编辑] @Gerrat 建议适用于有问题的文件,但不适用于其他文件。使用http://www.ncbi.nlm.nih.gov/nuccore/NC_000913.3和建议的编辑产生约 28 行输出,而我的原始代码输出 2084 行(但是,应该有 4332 行输出)。