2011-12-12 89 views
1
def __init__(self,emps=str(""),l=[">"]): 
    self.str=emps 
    self.bl=l 


def fromFile(self,seqfile): 
    opf=open(seqfile,'r')          
    s=opf.read()            
    opf.close()              
    lisst=s.split(">")            
    if s[0]==">": 
     lisst.pop(0)              
    nlist=[] 
    for x in lisst: 
     splitenter=x.split('\n')           
     splitenter.pop(0)            
     splitenter.pop()             
     splitstring="".join(splitenter)         
     nlist.append(splitstring)          
    nstr=">".join(nlist)             
    nstr=nstr.split() 
    nstr="".join(nstr) 
    for i in nstr: 
     self.bl.append(i) 
    self.str=nstr 
    return nstr 

def getSequence(self): 
    print self.str 
    print self.bl 
    return self.str 

def GpCratio(self): 
    pgenes=[] 
    nGC=[] 
    for x in range(len(self.lb)):         
     if x==">": 
      pgenes.append(x)           
    for i in range(len(pgenes)):           
     if i!=len(pgenes)-1:            
      c=krebscyclus[pgenes[i]:pgenes[i+1]].count('c')+0.000  
      g=krebscyclus[pgenes[i]:pgenes[i+1]].count('g')+0.000           
      ratio=(c+g)/(len(range(pgenes[i]+1,pgenes[i+1]))) 
      nGC.append(ratio)           
    return nGC 

s = Sequence() 
s.fromFile('D:\Documents\Bioinformatics\sequenceB.txt') 
print 'Sequence:\n', s.getSequence(), '\n' 
print "G+C ratio:\n", s.GpCratio(), '\n' 

我不明白爲什麼它給人的錯誤:初始化方法;自對象的LEN()

in GpCratio  for x in range(len(self.lb)): AttributeError: Sequence instance has no attribute 'lb'. 

當我打印的清單中DEF某個getSequence它打印測序正確的DNA列表,但我無法使用列表來搜索核苷酸。我的大學只允許我輸入1文件,而不是利用在定義其他參數,但「自我」 順便說一句,這是一類,但它拒絕了我將它張貼的話..類調用序列


+0

問題/ 1132941/python-the-mutable-default-argument中的至少驚訝) –

回答

4

看起來像一個錯字。您在__init__()例程中定義self.bl,然後嘗試訪問self.lb

(另外,emps=str("")是多餘的 - emps=""效果一樣好。)

但是,即使你改正錯字,循環將無法工作:

for x in range(len(self.bl)): # This iterates over a list like [0, 1, 2, 3, ...] 
    if x==">":     # This condition will never be True 
     pgenes.append(x) 

你可能需要做一些事情像

pgenes=[] 
for x in self.bl: 
    if x==">":     # Shouldn't this be != ? 
     pgenes.append(x) 

這也可以寫成一個列表理解:

pgenes = [x for x in self.bl if x==">"] 

在Python中,您幾乎不需要len(x)for n in range(...);你寧願直接迭代序列/迭代。

由於您的程序不完整,缺少樣本數據,因此無法在此處運行以查找所有其他缺陷。也許下面的內容可以讓你指出正確的方向。假設包含字符的字符串ATCG>

>>> gene = ">ATGAATCCGGTAATTGGCATACTGTAG>ATGATAGGAGGCTAG" 
>>> pgene = ''.join(x for x in gene if x!=">") 
>>> pgene 
'ATGAATCCGGTAATTGGCATACTGTAGATGATAGGAGGCTAG' 
>>> ratio = float(pgene.count("G") + pgene.count("C"))/(pgene.count("A") + pgene.count("T")) 
>>> ratio 
0.75 

但是,如果你不想看整個字符串,但在不同的基因(其中>是分隔符),使用這樣的:

>>> gene = ">ATGAATCCGGTAATTGGCATACTGTAG>ATGATAGGAGGCTAG" 
>>> genes = [g for g in gene.split(">") if g !=""] 
>>> genes 
['ATGAATCCGGTAATTGGCATACTGTAG', 'ATGATAGGAGGCTAG'] 
>>> nGC = [float(g.count("G")+g.count("C"))/(g.count("A")+g.count("T")) for g in genes] 
>>> nGC 
[0.6875, 0.875] 

但是,如果你要計算GC含量,那麼你當然不希望(G + C)/(A + T),但(G + C)/(A + T + G + C) - >nGC = [float(g.count("G")+g.count("C"))/len(g)]。關於你的`__init __(self,emps = str(「」),``l = [「>」]``)`:[請注意python中的可變默認參數](http://stackoverflow.com/)的

+0

哎呀哈哈謝謝; D,但現在它返回一個空列表D: –

+0

我也改變了:對於範圍內的x(len(self。 bl)): if self.bl [x] ==「>」: pgenes.append(x)但它仍然返回一個空的列表 –

+0

我改變了(雖然我還不熟悉這種風格)pgenes = [x for self.bl if x ==「>」],但它返回一個空的列表 –