Python - 列表索引超出范围?推特回复
Python - list index out of range? Twitter Replies
我一直在编写一个脚本来在日志中删除对单个推文的回复
现在,我还没有独自完成这一切,终于使它几乎可以工作,但我几乎在最后发现了一个索引错误,"List index out of range"
我有点困惑,因为我看不出这里有什么问题...有人可以解释一下吗? ._.
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]) 导致了这里的问题,但我不明白为什么会出现超出范围的索引错误,知道吗?
sys.argv
是指传递给脚本的命令行参数。当您 运行 脚本时, sys.argv[0]
将是您的脚本的名称。 sys.argv[1]
将是第一个参数,sys.argv[2]
第二个,依此类推。您的脚本期望 sys.argv[1]
将是存储结果的文件名。如果未提供,列表 sys.argv
的长度将为 1,索引 [1]
将超出范围。尝试 运行将您的脚本与
script.py output.txt
来自pythonofficial docs-
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not).
如果我要读这个,我会读到这个点-
The list of command line arguments passed to a Python script
这意味着,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]
它需要一个命令行参数以及脚本。
如果你是运行它来自命令行,使用这个:
python script.py tweet_file.txt
其中,
argv[0]被当作脚本名-script.py
arg[1]为推文文件名
您在执行时缺少推文文件名。从代码中我猜它可能是一些包含推文的文件。
我一直在编写一个脚本来在日志中删除对单个推文的回复
现在,我还没有独自完成这一切,终于使它几乎可以工作,但我几乎在最后发现了一个索引错误,"List index out of range"
我有点困惑,因为我看不出这里有什么问题...有人可以解释一下吗? ._.
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]) 导致了这里的问题,但我不明白为什么会出现超出范围的索引错误,知道吗?
sys.argv
是指传递给脚本的命令行参数。当您 运行 脚本时, sys.argv[0]
将是您的脚本的名称。 sys.argv[1]
将是第一个参数,sys.argv[2]
第二个,依此类推。您的脚本期望 sys.argv[1]
将是存储结果的文件名。如果未提供,列表 sys.argv
的长度将为 1,索引 [1]
将超出范围。尝试 运行将您的脚本与
script.py output.txt
来自pythonofficial docs-
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not).
如果我要读这个,我会读到这个点-
The list of command line arguments passed to a Python script
这意味着,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]
它需要一个命令行参数以及脚本。
如果你是运行它来自命令行,使用这个:
python script.py tweet_file.txt
其中,
argv[0]被当作脚本名-script.py
arg[1]为推文文件名
您在执行时缺少推文文件名。从代码中我猜它可能是一些包含推文的文件。