def isexact(pat):
for c in pat.upper():
if c not in 'ATGC':
return 0
return 1
def print_matches(ofh, enz, matches):
if matches:
print >>ofh, "Enzyme %s matches at:" % enz,
for m in matches:
print >>ofh, m,
print >>ofh
else:
print >>ofh, "No match found for enzyme %s." % enz
def get_site_only(pat):
newpat = ""
for c in pat:
if c.isalpha():
newpat += c
return newpat
def findpos(seq, pat):
matches = []
current_match = seq.find(pat)
while current_match != -1:
matches.append(current_match)
current_match =seq.find(pat, current_match+1)
return matches
seq = ""
ifh = open("C:\Python27\\link_cutzymes.txt",'r')
ofh = open("C:\Python27\\re-en-output.txt", "w")
line = ifh.readline()
while line:
fields = line.split()
name = fields[0]
pat = get_site_only(fields[2])
if isexact(pat):
print_matches(ofh, name, findpos(seq, pat))
line = ifh.readline()
else:
line = ifh.readline()
ofh.close()
ifh.close()
显示列表索引错误可以帮助我
Traceback(最近一次调用最后一次):文件 " C:/Users/ram/Desktop/rest_enz7.py",第55行,在 name = fields [0] IndexError:列表索引超出范围
答案 0 :(得分:0)
name = fields[0]
- 您可能正在读取一个空行,拆分它,并在索引0处访问它,这超出了空列表的范围。
您可以确保您的文件只包含格式的行,检查代码中的空行,或使用try
和except
来命名一些选项。
答案 1 :(得分:0)
从文件中读取数据时,如果数据不存在要拆分,则不会转换为列表。我可以在您的代码中看到 name = fields [0] 导致错误。
那时请在代码中使用try和except。
您可以将代码重写为:
try:
fields = line.split()
name = fields[0]
except:
pass
答案 2 :(得分:0)
string[x]
所做的是获取列表的第x个字母。这意味着如果第x个位置没有对象,则会出现错误。
因此,如果name = fields[0]
返回错误,那么fields
必须是一个空列表(它看起来像这样:[])因为没有第一个对象(Python从零开始计数所以字母0是字母1,字母1是字母2,依此类推)。您可以使用try:
和except:
来解决此问题:
try:
name = fields[0]
except:
name = '' #Or whatever code you want to run if it fails
取代name = fields[0]