2015-02-10 4 views
0

Я получаю эту ошибку на линии: if line[0].startswith(element): Я не знаю, почему я получаю эту ошибку. Может кто-нибудь помочь. Спасибо.Python: индекс индекса вне диапазона

f = open ('testLC31.txt', 'r') 
lineCount = 0 

toIgnore = ["AND", "ADD", "LEA", "PUTS", "JSR", "LD", "JSRR" , "NOT", "LDI" , 
      "LDR", "ST", "STI", "STR", "BR" , "JMP", "TRAP" , "JMP", "RTI" , 
      "BR", "ST", "STI" , "STR" , "BRz", "BRn" , "HALT"] 

label = [] 
instructions = [] 
i = 0 

for line in f: 
    line = line.split() 

    for element in toIgnore: 
     if line[0].startswith(element): 
      lineCount += 1 
     else: 
      label.append(line[0]) 
      instructions.append(line[1]) 
      i += 1 
      lineCount += 1 

SAMPLE FILE:

.ORIG x3000 

    AND R0, R0, #0   
    AND R1, R1, #0   
    AND R2, R2, #0   
    AND R7, R7, #0   

    LEA R0, MSG1   
    PUTS      

    LEA R1, MEMORYSPACE 

    JSR STRNG    

    LD  R0, NEWLINE 
    OUT 

    ADD R0, R1, #0   
    LD  R2, NEG48   
    ADD R0, R0, R2   
    PUTS      

    HALT 

    MSG1   .STRINGZ "Input a string (length <= 9): " 
    MEMORYSPACE .BLKW  9 
    NEWLINE  .FILL  #10 
    NEG48   .FILl  #-48 

      .END 
+0

Есть ли у вас какие-либо пустую строку в вашем файле? – JuniorCompressor

+0

ну, прежде всего, напечатать строку в вашем цикле, чтобы увидеть, что это такое –

+0

положить 'if line.strip()', чтобы поймать пустые строки и использовать 'с', чтобы открыть ваши файлы или хотя бы закрыть их. –

ответ

1

Есть несколько проблем с этим, я не знаю, каковы ваши требования, так что это один из подходов. Но вы добавляете то же самое слово для каждого экземпляра, что его не в списке игнорирования, поэтому будет много дубликатов. если вы хотите, чтобы удалены, дайте мне знать, и я могу добавить, что для вас

for line in f: 
    if line.split(): #check to see if it is actually something that can be split 
     elem = line.split() 
     if len(elem) > 1: #check to see that its more than one word if its not then you are on one of the ignore words 
      for element in toIgnore: 
       if elem[0].startswith(element): 
        lineCount += 1 
       else: 
        label.append(elem[0]) 
        instructions.append(elem[1]) 
        i += 1 
        lineCount += 1 

, если вы хотите иметь уникальные инструкции в вашем списке, то вы можете просто сделать это

f = open ('testLC31.txt', 'r') 
line_count = 0 

to_ignore = ["AND", "ADD", "LEA", "PUTS", "JSR", "LD", "JSRR" , "NOT", "LDI" , 
      "LDR", "ST", "STI", "STR", "BR" , "JMP", "TRAP" , "JMP", "RTI" , 
      "BR", "ST", "STI" , "STR" , "BRz", "BRn" , "HALT"] 

label = [] 
instructions = [] 
i = 0 
for line in f: 
    elem = line.split() if line.split() else [''] 
    if len(elem) > 1 and elem[0] not in to_ignore: 
     label.append(elem[0]) 
     instructions.append(elem[1]) 
     i += 1 
     line_count += 1 
    elif elem[0] in to_ignore: 
     line_count += 1 
+0

Мне нужны уникальные элементы, но это не будет обновлять lineCount для строк, которые содержат слова в них, которые находятся в toIgnore. – Chalupa

+0

@Chalupa см. Мое редактирование для хранения linecount, когда ваш элемент находится в списке игнорирования. Я также изменил переменные/объекты, чтобы использовать принятое соглашение об именах объектов python –

1

Причина вы получите индекс из ошибки диапазона является то, что "".split() результаты в пустом списке []. Таким образом, когда пустая строка считывается, это приводит к пустым спискам line, а list[0] приводит к ошибке за пределами диапазона.

+1

это уже было объяснено в комментариях 40 минут назад. .... –

Смежные вопросы