Python-列表索引超出范围? Twitter回复

时间:2018-08-21 17:12:24

标签: python list twitter tweepy

我一直在研究脚本,以在日志上抓取一条推文的回复

现在,我自己还没有做完所有事情,最后使它几乎可以工作,但是我几乎在最后发现了索引错误,即“列表索引超出范围”

我有点困惑,因为我看不出这里有什么问题...有人可以解释吗? ._。

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])在这里引起了问题,但是我不明白为什么出现超出范围的索引错误,是什么主意?

3 个答案:

答案 0 :(得分:1)

sys.argv是指传递给脚本的命令行参数。运行脚本时,sys.argv[0]将是脚本的名称。 sys.argv[1]将是第一个参数,sys.argv[2]是第二个参数,依此类推,等等。您的脚本期望sys.argv[1]将是存储结果的文件名。如果未提供,则列表sys.argv的长度为1,索引[1]的范围超出范围。尝试使用运行脚本

script.py output.txt

答案 1 :(得分:0)

从python official docs-

  

传递给Python脚本的命令行参数列表。 argv [0]是脚本名称(是否为完整路径名取决于操作系统)。

如果我要读这本书,我会读到点-

  

传递给Python脚本的命令行参数列表

这意味着sys.argv是一个列表,当您尝试从列表中不存在的内容(按索引)访问内容时,它会给您IndexError。您需要使用所需的参数调用脚本,然后可以从sys.argv[1]

访问这些参数。

例如-

python file_name.py some_argument

some_argument可以访问sys.argv[1]。您可以使用try或在argv上使用len来测试参数是否已传递到脚本,例如-

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

或-

if len(sys.argv) > 1:
    args = sys.argv[1]

答案 2 :(得分:0)

它希望在脚本中加入命令行参数。

如果您是从命令行运行的,请使用以下命令:

python script.py tweet_file.txt

在哪里

argv [0]被视为脚本名称-script.py

arg [1]是推文文件名

您在执行时缺少tweet文件名。从代码中,我猜可能是其中包含推文的文件。