【问题标题】:Python - list index out of range? Twitter RepliesPython - 列表索引超出范围?推特回复
【发布时间】:2019-01-27 22:30:17
【问题描述】:

我一直在编写一个脚本,以便在日志中删除对单个推文的回复

现在,我自己还没有完成这一切,最后让它几乎可以工作,但我几乎在最后发现了一个索引错误,“列表索引超出范围”

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

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]) 导致了这里的问题,但我不明白为什么会出现超出范围的索引错误,知道吗?

【问题讨论】:

  • 你能发布完整的错误信息吗?

标签: python list twitter tweepy


【解决方案1】:

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

运行你的脚本

script.py output.txt

【讨论】:

  • 谢谢!就是这样!
【解决方案2】:

来自pythonofficial docs-

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

如果我要读这个,我会读到这个点 -

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

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

例如-

python file_name.py some_argument

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

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

或者-

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

【讨论】:

  • 没问题@SantiagoGuinand
【解决方案3】:

它需要一个命令行参数以及脚本。

如果你是从命令行运行它,使用这个:

python script.py tweet_file.txt

在哪里,

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

arg[1] 是推文文件名

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

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多