Почему я получаю сообщение об ошибке «Список индексов вне диапазона» и как это исправить? - PullRequest
0 голосов
/ 31 марта 2019

Мне нужно, чтобы мой бот проверял новые сообщения Gmail из TradingView и, в зависимости от темы, выполнял действия, если

import email, imaplib
import datetime, time
import logging

volume = "0.1"
user = 'xxxxx@gmail.com'
password = 'xxxxxxx'
imap_url = 'imap.gmail.com'

def auth(user,password,imap_url):
    m = imaplib.IMAP4_SSL(imap_url)
    m.login(user,password)
    return m

def readmail(volume):
    time.sleep(1.5)
    m = imaplib.IMAP4_SSL("imap.gmail.com")
    m = auth(user,password,imap_url)
    m.select('INBOX')
    resp, items = m.search(None,
                           "NOT SEEN FROM tradingview")
    items = items[0].split()
    for emailid in items:
        resp, data = m.fetch(emailid,
                             "(RFC822)")
        email_body = data[0][1]
        mail = email.message_from_bytes(email_body)
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        try:
            pair = mail['Subject'].split()[2]
            if mail['Subject'].split()[3] == "Buy":
                m.store(emailid, '+FLAGS', '\Seen')
                print(st + ' \x1b[6;30;42m' + 'Buy')
                logging.info(st + ' Buy')
            if mail['Subject'].split()[3] == "Sell":
                m.store(emailid, '+FLAGS', '\Seen')
                print(st + ' \x1b[6;30;41m' + 'Sell')
                logging.info(st + ' Sell')
        except Exception as e:
            print(e)
            logging.info(e)

while True:
    try:
        readmail(volume)
    except Exception as e:
        print(e)
        logging.info(e)

Ожидается:

print (st + '\ x1b[6; 30; 42m '+' Buy ') или распечатать (st +' \ x1b [6; 30; 42m '+' Sell ')

Факт:

индекс списка изrange

Но по какой-то причине мой бот читает новые сообщения m.store (emailid, '+ FLAGS', '\ Seen') и делает отметку "read"

1 Ответ

0 голосов
/ 01 апреля 2019

Отличный вопрос!Я сталкивался с этим много раз, поэтому могу сделать несколько полезных выводов.Всякий раз, когда вашей ошибкой является «Список индексов вне диапазона», 95% времени это список, содержащий не столько значений, сколько вы думаете.Я вижу, что вы новый участник StackOverflow.Добро пожаловать в сообщество!Если вы не знакомы с немного более продвинутыми концепциями списка Python, позвольте мне объяснить.

Все в списке имеет индексное значение.Он начинается с нуля и увеличивается на единицу для каждого элемента списка, независимо от типа данных в списке.

Пример:

lista= ['This', 'Is', 'A', 'List!']

Показатель выше имеет низкий индекс 0 ипоследний индекс равен 3. Разбивка:

lista= ['This', 'Is', 'A', 'List!']
       index 0   1     2    index 3

Скорее всего, у вас есть список с меньшим индексом, который будет указан в вашем коде позже.Так что, возможно, вы звоните index [4] в приведенном выше списке.Это вернет ошибку, потому что нет четвертого индекса.Это .... вне диапазона!Вот что означает ваш код ошибки!

Вы можете легко проверить, насколько длинен ваш список с помощью метода приведения len ().Это скажет вам, сколько индексов в вашем списке.Если бы я запустил следующий фрагмент:

len(lista)

Я бы получил:

4

Это показывает четыре индекса.Если вы хотите узнать самый большой индекс или его верхний, минус результат приведенного выше фрагмента на 1:

print(len(lista)-1)

, который возвращает:

3

Какой ваш главный индекс.Поэтому проверьте размер своих списков, и я уверен, что ваши проблемы будут решены, если вы укажете правильные индексы.Также убедитесь, что данные добавляются в список правильно, иначе их там точно не будет!Удачи во всех ваших кодировках в будущем и добро пожаловать в сообщество Stack Exchange!

Ethan J.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...