Python中的倒计时for循环

0 投票
1 回答
3873 浏览
提问于 2025-04-17 06:18

这是我的脚本,我想让它打印并减去 1

for eachNumber in range(counter, 0, -1): print(eachNumber)

这个循环是从 counter 开始的,每次循环都会执行一次。当我尝试把它放到我现在的 for 循环里时,它会打印出所有的完整数字,直到达到 counter。我想要的是在每次 for video_id in ids: 的循环中,从 counter 开始倒计时。

#!/usr/bin/env python
"""Download video meta-info for a given video urls from input file.

Input files is in Firefox'es bookmarks export file
"""
import csv
import re
import sys
import urlparse
from BeautifulSoup import BeautifulSoup
from gdata.youtube.service import YouTubeService

# parse bookmarks.html
with open(sys.argv[1]) as bookmark_file:
    soup = BeautifulSoup(bookmark_file.read())

# extract youtube video urls
video_url_regex = re.compile('http://www.youtube.com/watch')
urls = [link['href'] for link in soup('a', href=video_url_regex)]

# extract video ids from the urls
ids = []
for video_url in urls:
    url = urlparse.urlparse(video_url)
    video_id = urlparse.parse_qs(url.query).get('v')
    if not video_id: continue # no video_id in the url
    ids.append(video_id[0])

# remove duplicates
ids = list(set(ids))

# print total number of video_ids
counter = len(ids)
print counter

# get some statistics for the videos
yt_service = YouTubeService()
yt_service.developer_key = 'AI39si4yOmI0GEhSTXH0nkiVDf6tQjCkqoys5BBYLKEr-PQxWJ0IlwnUJAcdxpocGLBBCapdYeMLIsB7KVC_OA8gYK0VKV726g'
#NOTE: you don't need to authenticate for readonly requests
yt_service.ssl = True #NOTE: it works for readonly requests
#yt_service.debug = True # show requests

writer = csv.writer(open(sys.argv[2], 'wb'))
for video_id in ids:
    try:
        entry = yt_service.GetYouTubeVideoEntry(video_id=video_id)
        dir(entry.rating)
        ['FindExtensions', 'ToString', '_AddMembersToElementTree', '_BecomeChildElement', '_ConvertElementAttributeToMember', '_ConvertElementTreeToMember', '_HarvestElementTree', '_ToElementTree', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_attributes', '_children', '_namespace', '_tag', 'average', 'extension_attributes', 'extension_elements', 'max', 'min', 'num_raters', 'text']
        comments = yt_service.GetYouTubeVideoCommentFeed(video_id=video_id)
    except Exception, e:
        print >>sys.stderr, "Failed to retrieve entry video_id=%s: %s" %(
            video_id, e)
    else:
        title = entry.media.title.text
        print "Title:", title
        view_count = entry.statistics.view_count
        print "View count:", view_count
        favorites = entry.statistics.favorite_count
        print "Favorite Count:", favorites
        comments = comments.total_results.text
        print "Comment Count:", comments
        if entry.rating is None: # skip it
            average = 0
        else:
            average = entry.rating.average
        print "Average Rating:", average
        if entry.rating is None: # skip it
            num_raters = 0
        else:
            num_raters = entry.rating.num_raters
        print "Number of Raters:", num_raters
        author = entry.author[0].name.text
        print "Autor:", author
        published = entry.published.text
        print "Published on:", published
        tags = entry.media.keywords.text
        print "Tags:", tags
        print "#########################################################"
        writer.writerow((video_id, title, view_count, favorites, comments, average, num_raters, author, published, tags))

1 个回答

2

我不太确定你想表达的意思,但我觉得问题在于你把一个循环放在了另一个循环里面,而其实你并不想这样做。试着在你的 ids 循环里面加上这个:

print counter, "videos remaining"
counter -= 1

这样做只是让计数器每处理一个Id减少一次,而不是对每个Id都跑一遍完整的范围。

撰写回答