Я работаю над сценарием, чтобы отбросить ответы одного твита в журнале

Теперь я не работал над этим сам, и, наконец, заставил это почти работать, но я обнаружил ошибку индекса почти в конце, "Список индекса вне диапазона"

Я немного запутался, потому что я не понимаю, в чем здесь проблема ... может кто-нибудь объяснить? ._ .

def tweet_url(t):
    return "https://twitter.com/%s/status/%s" % (t.user.screen_name, t.id)

def get_tweets(filename):
    for line in open(filename):
        yield twitter.Status.NewFromJsonDict(json.loads(line))

def get_replies(tweet):
    user = tweet.user.screen_name
    tweet_id = tweet.id
    max_id = None
    logging.info("looking for replies to: %s" % tweet_url(tweet))
    while True:
        q = urllib.parse.urlencode({"q": "to:%s" % user})
        try:
            replies = t.GetSearch(raw_query=q, since_id=tweet_id, max_id=max_id, count=100)
        except twitter.error.TwitterError as e:
            logging.error("caught twitter api error: %s", e)
            time.sleep(60)
            continue
        for reply in replies:
            logging.info("examining: %s" % tweet_url(reply))
            if reply.in_reply_to_status_id == tweet_id:
                logging.info("found reply: %s" % tweet_url(reply))
                yield reply
                # recursive magic to also get the replies to this reply
                for reply_to_reply in get_replies(reply):
                    yield reply_to_reply
            max_id = reply.id
        if len(replies) != 100:
            break

if __name__ == "__main__":
    logging.basicConfig(filename="replies.log", level=logging.INFO)
    tweets_file = sys.argv[1] 
    for tweet in get_tweets(tweets_file):
        for reply in get_replies(tweet):
            print(reply.AsJsonString())

Итак ... в нижней строке, список (sys.argv [1]) вызывает проблему здесь, но я не понимаю, почему появляется ошибка индекса вне диапазона, вы понимаете?

0
Santiago Guinand 21 Авг 2018 в 20:12

3 ответа

Лучший ответ

Из официальных документов Python -

Список аргументов командной строки, переданных скрипту Python. argv [0] - это имя сценария (это зависит от операционной системы, является ли это полным путем или нет).

Если бы я прочитал это, я бы читал до этой точки -

Список аргументов командной строки, передаваемых скрипту Python

Это означает, что sys.argv является списком, и когда вы пытаетесь получить доступ к чему-либо из списка, которого нет в нем (по индексу), он дает вам IndexError. Вам нужно вызвать ваш скрипт с нужными аргументами, и эти аргументы будут доступны из sys.argv[1]

Например -

python file_name.py some_argument

И some_argument будет доступен из sys.argv[1]. Вы можете проверить, были ли переданы аргументы в скрипт, используя try или len для argv, как -

try:
    args = sys.argv[1]
except IndexError:
    print('No argument passed')

Или -

if len(sys.argv) > 1:
    args = sys.argv[1]
0
Sushant 21 Авг 2018 в 17:21

sys.argv относится к аргументам командной строки, передаваемым вашему сценарию. Когда вы запустите скрипт, sys.argv[0] будет именем вашего скрипта. sys.argv[1] будет первым параметром, sys.argv[2] вторым и т. Д. И т. Д. Ваш сценарий ожидает, что sys.argv[1] будет именем файла для хранения результатов. Если это не предусмотрено, список sys.argv будет иметь длину один, а индекс [1] будет вне диапазона. Попробуйте запустить свой скрипт с

script.py output.txt

1
J. Blackadar 21 Авг 2018 в 17:19

Ожидается аргумент командной строки вместе со скриптом.

Если вы запускаете его из командной строки, используйте это:

python script.py tweet_file.txt

Где,

argv [0] обрабатывается как скрипт name-script.py

arg [1] - это имя файла твита

Вы пропустили имя файла твита при исполнении. Из кода я думаю, что это может быть какой-то файл с твитами в нем.

0
Jim Todd 21 Авг 2018 в 17:30
51953688