#list index超出范围

时间:2014-10-02 13:37:02

标签: python python-2.7 python-3.x

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:列表索引超出范围

3 个答案:

答案 0 :(得分:0)

name = fields[0] - 您可能正在读取一个空行,拆分它,并在索引0处访问它,这超出了空列表的范围。

您可以确保您的文件只包含格式的行,检查代码中的空行,或使用tryexcept来命名一些选项。

答案 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]