2015-06-08 4 views
0

У меня есть следующая функция в python, которая принимает входные данные и анализирует их в словаре. Я пытаюсь передать ему следующий ввод, и по какой-то причине строки artist=block[0] заставляют его прерываться, потому что индекс списка выходит за пределы диапазона, и я действительно смущен почему. Он прерывается после чтения во втором Led Zeppelin. Любая помощь в этом вопросе была бы весьма признательна.Список Python за пределами

Входной

Led Zeppelin 
1969 II 
-Whole Lotta Love 
-What Is and What Should Never Be 
-The Lemon Song 
-Thank You 
-Heartbreaker 
-Living Loving Maid (She's Just a Woman) 
-Ramble On 
-Moby Dick 
-Bring It on Home 

Led Zeppelin 
1979 In Through the Outdoor 
-In the Evening 
-South Bound Saurez 
-Fool in the Rain 
-Hot Dog 
-Carouselambra 
-All My Love 
-I'm Gonna Crawl 

Hello 
Hello 
Hello 
Hello 

Bob Dylan 
1966 Blonde on Blonde 
-Rainy Day Women #12 & 35 
-Pledging My Time 
-Visions of Johanna 
-One of Us Must Know (Sooner or Later) 
-I Want You 
-Stuck Inside of Mobile with the Memphis Blues Again 
-Leopard-Skin Pill-Box Hat 
-Just Like a Woman 
-Most Likely You Go Your Way (And I'll Go Mine) 
-Temporary Like Achilles 
-Absolutely Sweet Marie 
-4th Time Around 
-Obviously 5 Believers 
-Sad Eyed Lady of the Lowlands 

Функция

def add(data, block): 
    artist = block[0] 
    album = block[1] 
    songs = block[2:] 
    if artist in data: 
     data[artist][album] = songs 
    else: 
     data[artist] = {album: songs} 
    return data 

def parseData(): 

    global data,file 
    file=os.getenv('CDDB') 
    data = {} 
    with open(file) as f: 
     block = [] 
     for line in f: 
      line = line.strip() 
      if line == '': 
       data = add(data, block) 
       block = [] 
      else: 
       block.append(line) 
     data = add(data, block) 
     f.close() 


    return data 
+0

Вам не нужно 'f.close()'. Менеджер контекста выполняет эту работу за вас. – warvariuc

+1

'block = []' - пустой массив. Поэтому 'block [0]' находится вне диапазона. Отлаживайте свой код, чтобы выяснить, при каких обстоятельствах 'block' равен' [] 'при попытке доступа к блоку [0]'. – Blorgbeard

+0

Всякий раз, когда парсер пытается разобрать в блоке, начинающемся с 'Hello', когда блок равен []. Что может вызвать это? – Logan

ответ

2

Просто добавьте проверку вменяемости к вашему add() функции:

def add(data, block): 
    if not block: 
     return 

Кроме того, нет никаких оснований использовать глобальные переменные. Вот иллюстрация:

def parseData(path): 

    data = {} 
    block = [] 

    with open(path) as f: 
     for line in f: 
      line = line.strip() 
      if line == '': 
       add(data, block) 
       block = [] 
      else: 
       block.append(line) 
     add(data, block) 

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