IndexError: индекс списка вне допустимого диапазона — Python CSV

Я извлекаю 10 твитов из Twitter с помощью tweepy и сохраняю их в CSV для последующего отображения на веб-странице внешнего интерфейса. Мой код обновляется каждые 60 минут, и в определенное время я получаю ошибку IndexError.

Ниже приведена точная ошибка:

вернуть кс[5]

IndexError: индекс списка вне допустимого диапазона

Ниже приведена функция для извлечения конкретного твита из CSV:

def tweet6(self):
    with codecs.open('HELLOTWITTER.csv', 'r', encoding='utf-8', errors='ignore') as f:
        reader = csv.reader(f)
        d = {}
        for i, row in enumerate(reader):
            d[row[0]]=row[1:]
            if (i>=10):
                break    
    ks=list(d)
    return (ks[5])

Эта ошибка возникает только время от времени, но я не могу понять, почему это происходит, хотя в CSV записаны все 10 твитов каждый раз, когда весь код обновляется. Кроме того, если я запускаю код еще раз, ошибка исчезает, и веб-страница загружается без каких-либо проблем с твитами, что удивительно!

Что мне не хватает? Любая помощь высоко ценится! Спасибо!


person Pooja    schedule 01.12.2017    source источник
comment
Пожалуйста, отформатируйте код правильно.   -  person rvd    schedule 01.12.2017
comment
Размещение нескольких print для проверки того, содержат ли переменные ожидаемые результаты (или использование вместо этого отладчика), как правило, полезно   -  person Michael Butscher    schedule 01.12.2017
comment
Ясно, что в какой-то момент вы заблуждаетесь относительно того, что в CVS каждый раз записываются все 10 твитов. В противном случае вы ожидаете, что мы поверим, что Python лжет и просто притворяется. индекс списка вне допустимого диапазона означает, что индекс списка находится вне допустимого диапазона, и единственная причина, по которой вы получаете эту ошибку, заключается в том, что индекс списка находится вне допустимого диапазона.   -  person Ken White    schedule 01.12.2017
comment
@KenWhite: я понимаю, что это проблема с пустой строкой или недостаточными данными. Но есть ли способ справиться с этой ошибкой?   -  person Pooja    schedule 04.12.2017
comment
Я думаю, что ответ, который вы приняли, касается этого, не так ли?   -  person Ken White    schedule 04.12.2017


Ответы (1)


Как указал Кен Уайт в комментариях выше. Ошибка вызвана тем, что вы пытаетесь получить доступ к индексу, находящемуся за пределами списка.

Что происходит, так это то, что в вашем CSV-файле есть пустая строка, которую python не может обработать, потому что вы вызываете index 0, хотя она не существует, поэтому python выдает исключение.

Чтобы исправить эту ошибку, вам нужно проверить, достаточно ли элементов в списке для запуска вашего кода. Используя

if(len(row) < 1):
   continue

Еще одно место, которое может вызвать проблемы, — это когда вы берете список d и помещаете его в другой список ks. Затем вы пытаетесь вернуть 5-й объект в новом списке. Однако объекта нет, потому что теперь у вас есть список, который выглядит так:

ks={{tweet,tweetyouwant,tweet},{list,two,if,present}}

Когда вы ожидали, что список будет выглядеть так

ks={tweet,tweetyouwant,tweet}

Чтобы исправить это, просто избавьтесь от ks=list(d) и вызовите d везде, где бы вы вызывали ks.


Это должно понравиться всему вашему фрагменту.

def tweet6(self):
    with codecs.open('HELLOTWITTER.csv', 'r', encoding='utf-8', errors='ignore') as f:
        reader = csv.reader(f)
        d = {}
        for i, row in enumerate(reader):

            #Verify row is within range
            if(len(row) < 1):
                continue

            #Get the rows values
            d[row[0]]=row[1:]

            #If past row 10 then break
            if (i>=10):
                break  

    #ks=list(d) #Not needed D is already a list
    return (d[5]) #return the row of the 6th tweet
person Suit Boy Apps    schedule 01.12.2017
comment
Проблема также может быть вызвана ks[5], однако я не думаю, что это так же вероятно, как row отсутствие в нем достаточного количества данных. - person Suit Boy Apps; 01.12.2017
comment
Эй, я все еще продолжаю получать IndexError. Что-нибудь еще, что я мог бы сделать? :/ - person Pooja; 04.12.2017
comment
Вы проверили ks[5]? Кажется, это единственное другое место, о котором я могу думать, что может вызвать проблемы. Мой следующий совет — добавлять операторы печати между каждой строкой, чтобы увидеть, где она ломается. Так легче понять, где ошибка. - person Suit Boy Apps; 04.12.2017
comment
Глядя на ваш OP, определенно ks5 возвращает ошибку. Попробуйте просто вернуть D. У вас уже есть список D, который вы затем добавляете во второй список с ks=list(d) извините за отсутствие форматирования. Я на мобильном телефоне. - person Suit Boy Apps; 04.12.2017