2007-08-08

 

Python Cookbook 3.4 计算播放歌曲的时长

需求:

你需要知道播放列表中歌曲的总时长。

讨论:

使用datetime模块的内建函数sum来作统计工作:

import datetime
def totaltimer(times):
    td = datetime.timedelta(0)    # initial value of sum (must be a timedelta)
    duration = sum([
        datetime.timedelta(minutes=m, seconds=s) for m, s in times],
        td)
    return duration
if _ _name_ _== '_ _main_ _':        # test when module run as main script
    times1 = [(2, 36),        # list containing tuples (minutes, seconds)
              (3, 35),
              (3, 45),]
    times2 = [(3, 0),
              (5, 13),
              (4, 12),
              (1, 10),]
    assert totaltimer(times1) == datetime.timedelta(0, 596)
    assert totaltimer(times2) == datetime.timedelta(0, 815)
    print ("Tests passed.\n"
           "First test total: %s\n"
           "Second test total: %s" % (
            totaltimer(times1), totaltimer(times2)))

当我工作的时候,会播放一个很大的播放列表。我想知道自己选择的歌曲的总时长,而不是重新建立一个播放列表,所以写下了这个脚本。
一个datetime.timedelta对象一般返回两个给定的datetime对象的差值 。当然,你也可以创建自己的timedelta对象来衡量任意之间的差值。在在这里,我们需要计算时长,所以timedelta正是我们需要的。
datetime.timedelta函数可以有很多可选参数:days,seconds,microseconds,milliseconds,minutes,hours,weeks.所以,创建对象的时候,你需要使用命名参数,否则自己会被搞混的。如果你仅仅使用了datetime.timedelta(m,n),而没有使用命名参数,该类会认为m表示days,n表示seconds,那真的会产生很奇怪的结果。
使用内建的sum函数来计算一个列表中的值比如timedelta,你需要给sum传递第二个参数来表示初始值,否则它会初始为0,整数0,而你会得到一个异常,因为将整数和timedelta相加。列表中的对象需要支持数字加法。(strings是没有加法的,所以,不要用sum来加string或者别的列表!)。在Python2.4中,对于sum的第一个参数,我们可以用生成表达式来替换[],这样我们可以方便的处理具有大数据量的列表。
为了测试目的,我自己手动创建了一个列表,里面的元组表示分钟和秒。这个脚本可以修改为加强版,比如支持更多的格式(如mm:ss)或者直接从文件中读取数据。

相关说明:

sum(...)
    sum(sequence, start=0) -> value
   
    Returns the sum of a sequence of numbers (NOT strings) plus the value
    of parameter 'start'.  When the sequence is empty, returns start.


标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?