首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用biopython操作gff文件

用biopython操作gff文件
EN

Stack Overflow用户
提问于 2014-09-09 11:57:46
回答 1查看 1.7K关注 0票数 0

我有一个GFF文件,这是一个标签有限的9列文件。我的Gff文件如下:

代码语言:javascript
复制
chr1    GenBank region  1   2821361 .   +   1   ID=CP000253.1
chr1    S-MART  utr5    313 516     .   +   .   ID=CP000253.1|+313..516
chr1    GenBank gene    517 1878    .   +   1   ID=SAOUHSC_00001

.诸若此类。

问题陈述:

现在,我要合并满足条件的行。条件是ith行的第5列值应等于i+1行的第4列减去1。

所以最终的结果应该是

代码语言:javascript
复制
chr1    GenBank region  1   2821361 .   +   1   ID=CP000253.1
chr1    predict TU      313 1878    .   +   1   ID=SAOUHSC_00001

为此,我编写了以下程序:

代码语言:javascript
复制
from BCBio import GFF
from Bio.SeqFeature import SeqFeature, FeatureLocation

in_file = "infile.gff"
out_file = "outfile.gff"

limit_info = dict(
        gff_type = ['CDS','exon','gene','mRNA','operon','rRNA','tRNA','utr3','utr5'])
new_qualifiers = {"source": "prediction","ID": "CP000253.1"}
new_sub_qualifiers = {"source": "prediction"}
new_top_feature = SeqFeature(FeatureLocation(0, 2821361), type="genomeRegion", strand=1,
                         qualifiers=new_qualifiers)
i=0

in_handle = open(in_file)
for rec in GFF.parse(in_handle, limit_info=limit_info):
    for i in range(10):
        if rec.features[i].location.end == rec.features[i+1].location.start :
            # print rec.features[i]
            new_top_feature.sub_features[i] =     
[SeqFeature(FeatureLocation(rec.features[i].location.start ,  
rec.features[i+1].location.end ,strand=rec.features[i].strand),  
type="Transcription_unit",  qualifiers=new_sub_qualifiers)]             

in_handle.close()

rec.features = [new_top_feature]

with open(out_file, "w") as out_handle:
    GFF.write([rec], out_handle)

我得到以下错误:

代码语言:javascript
复制
/usr/lib/python2.7/dist-packages/Bio/SeqFeature.py:171: BiopythonDeprecationWarning: Rather using f.sub_features, f.location should be a CompoundFeatureLocation
  BiopythonDeprecationWarning)
Traceback (most recent call last):
  File "/home/nkumar/workplacekepler/random/src/limit.py", line 26, in <module>
    new_top_feature.sub_features[i] = [SeqFeature(FeatureLocation(rec.features[i].location.start , rec.features[i+1].location.end ,strand=rec.features[i].strand), type="Transcription_unit",  qualifiers=new_sub_qualifiers)]
IndexError: list assignment index out of range

即使它是一个超出范围误差的指数,我也无法弄清楚,出了什么问题?

代码语言:javascript
复制
in_handle = open(in_file)
for rec in GFF.parse(in_handle, limit_info=limit_info):
    for i in range(10):        
        if rec.features[i].location.end == rec.features[i+1].location.start :
            print 1          
        else:
            print rec.features[i]            
in_handle.close()

这一个完美的工作和打印所有的特征。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-09 16:36:17

您将new_top_feature定义为:

代码语言:javascript
复制
type: genomeRegion
location: [0:2821361](+)
qualifiers: 
    Key: ID, Value: CP000253.1
    Key: source, Value: prediction

但是它没有子特征

代码语言:javascript
复制
>>> print new_top_feature.sub_features
[]

因此,new_top_feature.sub_features是一个空列表。不能直接分配给空列表:

代码语言:javascript
复制
>>> a = []
>>> a[0] = 3
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list assignment index out of range

这就是你要做的

代码语言:javascript
复制
new_top_feature.sub_features[i] =  .....

要将数据添加到此列表中,您应该使用append而不是索引。如果您需要按给定的顺序填写列表,则可以创建一个大小为零的足够大小的列表,然后在它们出现时将值分配给这些职位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25744059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档