我想让程序做的是获取与某个条形码相关的序列,并执行定义的功能(序列的平均长度和标准偏差,减去条形码和非相关txt,由同一个条形码标识)。我写了一些类似的东西,并基于类似的程序,但我一直得到一个索引错误。我们的想法是,第一个条码的所有序列都将被处理为barcodeconter=0,第二个条形码的序列将被处理为barcodeconter=1,等等。希望这是足够的信息,抱歉,如果它是混乱的。在
输入:
import sys
import math
def avsterr(x):
ave = sum(x)/len(x)
ssq = 0.0
for y in x:
ssq += (y-ave)*(y-ave)
var = ssq / (len(x)-1)
sdev = math.sqrt(var)
stderr = sdev / math.sqrt(len(x))
return (ave,stderr)
barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
barcodeCounter = 0
for barcode in b:
barcodeCounter = barcodeCounter + 1
barcode = barcode.strip()
print "barcode: %s" % barcode
handle = open(sequence, "r")
for line in handle:
print line
seq = line.split(' ',1)[-1].strip()
print "seq: %s" % seq
potential_barcode = seq[0:len(barcode)]
print "something"
if potential_barcode == barcode:
print "Checking sequences"
outseq = seq.replace(potential_barcode, "", 1)
outseq_length = [len(outseq)]
# toprocess.append("")
# toprocess[barcodeCounter] += outseq.strip
toprocess[barcodeCounter].extend(outseq.strip) #IndexError/line40
# toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
print "outseq: %s" % outseq
print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
print "BC: %i" % barcodeCounter
handle.close()
b.close()
one = len(toprocess[0])
#two = lengths[2]
#three = lengths[3]
print one
#(av,st) = avsterr(lengths)
#print "%f +/- %f" % (av,st)
输出:
^{pr2}$这就是我所依据的准则。在
sequenceCounter = -1
for line in handle:
if line[0] == ">":
sequenceCounter = sequenceCounter + 1
# print "seqid %s\n" % line
seqidList.append(line)
seqList.append("")
if line[0] != ">":
seqList[sequenceCounter] = seqList[sequenceCounter] + line.strip()
编辑: 添加了枚举函数并注释掉了barcodeCounter的内容。在
barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
# barcodeCounter = barcodeCounter + 1
barcode = barcode.strip()
print "barcode: %s" % barcode
handle = open(sequence, "r")
for line in handle:
print line
seq = line.split(' ',1)[-1].strip()
print "seq: %s" % seq
potential_barcode = seq[0:len(barcode)]
print "something"
if potential_barcode == barcode:
print "Checking sequences"
outseq = seq.replace(potential_barcode, "", 1)
outseq_length = [len(outseq)]
toprocess.append("")
# toprocess[barcodeCounter] += outseq.strip
toprocess[barcodeCounter].append(outseq.strip) #AttributeError line 40
# toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
print "outseq: %s" % outseq
print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
print "BC: %i" % barcodeCounter
handle.close()
b.close()
新错误:
barcode: ATTAG
S01 ATTAGAAAAAAA
seq: ATTAGAAAAAAA
something
Checking sequences
Traceback (most recent call last):
File "./FinalProject.py", line 40, in <module>
toprocess[barcodeCounter].append(outseq.strip)
AttributeError: 'str' object has no attribute 'append'
无问题代码:
barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
# barcodeCounter = barcodeCounter + 1
barcode = barcode.strip()
print "barcode: \n%s\n" % barcode
handle = open(sequence, "r")
for line in handle:
print line
seq = line.split(' ',1)[-1].strip()
print "seq: %s" % seq
potential_barcode = seq[0:len(barcode)]
# print "something"
if potential_barcode == barcode:
print "Checking sequences"
outseq = seq.replace(potential_barcode, "", 1)
outseq_length = [len(outseq)]
toprocess.append("")
toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq
@不是你帮了忙,谢谢。我不是最聪明的编程有时(大多数时候)。我还必须改变添加新序列的方式,因为它们是str
而不是{
代码
专门用于访问列表变量中已存在的内容。您给它的数字告诉Python您要查找的是列表的哪个部分。值得注意的是,列表从0开始计数,而不是从1开始。所以下面的代码:
^{pr2}$会导致打印
(负索引实际上从末尾开始计数,因此-1表示d,而-2表示c)
索引器错误是当您给出一个列表中没有存储的数字时发生的情况。如果我试图调用list[4],我会得到一个索引错误,因为它不存在,就像我试图调用一个不存在的变量一样。在
与字典不同,不能通过提供不存在的索引来设置列表值。您需要使用append或extend之类的方法,但不能像您那样在给定索引然后调用extend函数时那样使用。严格说来
告诉Python获取存储在列表[3]中的值并在其上附加一个“e”,而不是添加到整个列表本身。在
这实际上会把e添加到我的列表中。在
你实际上有两个问题。在
首先,从1开始计数,而不是从0开始。从},最后一个将是
0
开始barcodeCounter
,然后在使用它之前递增它。这意味着,如果你有3个条形码,你试图设置toprocess[1]
,然后toprocess[2]
,然后{IndexError
。在请注意,您基于它的代码以},以避免这个问题。在
sequenceCounter = -1
开头,而不是{不过,还有一个更简单的解决方案:使用
enumerate
为您计算:不需要记住是从-1,0,还是1开始,或者在哪里进行递增,或者任何其他的;它只会自动得到0,1,2等,直到
len(b)-1
。在第二,即使计算正确,
toprocess
的大小与b
不一样。实际上,它是完全空的,所以toprocess[anything]
总是引发异常。在要将新值附加到
^{pr2}$list
的末尾,请调用append
方法:同样,请注意,您所基于的代码总是在执行
seqList[sequenceCounter] =
之前执行seqList.append("")
。(请注意,这有点棘手,有时它append
和sequenceCounter
递增,有时两者都没有,并使用前面的值sequenceCounter
分配给seqList[sequenceCounter]
。)您必须执行相同的操作。在相关问题 更多 >
编程相关推荐