这段时间一直在学习Python,把基础语法看完之后,就像找一点小练习来测试一下学习的程度,但是网络上大部分的东西都是一些算术题,比如水仙花算法,杨辉三角等等问题,做起来没什么意思,旁边一个前端开发的哥们给我出了一个题,挺有意思的,发出来给大家看看,一起学习学习。
把音乐打开的同时启动脚本,音乐放到哪句,Python程序就会打印出唱的那句的歌词。
[00:00.08]光辉岁月
[00:00.82]演唱:Beyond
[00:01.51]
[00:29.09]钟声响起归家的讯号
[00:33.65]在他生命里
[00:36.87]彷佛带点唏嘘
[00:42.10]黑色肌肤给他的意义
[00:46.58]是一生奉献 肤色斗争中
上面是歌词文件的格式,最关键的内容就是时间与歌词的剥离,简单来说就是我们要把每一句的时间取出来,按照时间的顺序做一个延迟,然后根据时间的延迟,把歌词一句一句打出来
time模块的使用方法大家可以自行百度,但是使用time模块之后,返回的时间是微秒(坑爹啊,为毛线不是毫秒),我们可以看歌词文件中的时间格式是【分:秒:毫秒】,并没有微秒啊!!!!没有微秒啊!!!!没有微秒啊!!!
只能自己去执行一个转换了,我是把歌词文件中的时间全部转成微秒来计算,代码如下:
def changenum(shijian):
return float(shijian[0:2]) * 60 * 100000 + float(shijian[3:5]) * 100000 + float(shijian[6:])*100
这样歌词的时间和Python的时间格式就一致了
只处理时间肯定是不行的,我们需要把时间和歌词关联起来,每一行歌词和时间都是对应的,我们需要吧他做一个切片处理,把时间和歌词分隔开后再做一个映射,有两种方法
1.使用字典,时间为key歌词内容为value,用k-v对的方式来处理映射
2.使用列表,因为列表是有顺序的,我们可以按顺序吧时间插入一个列表,再按顺序把歌词插入另一个列表,这样只要按顺序走,L1[0]就是对应L2[0]
以上两种方法理论上都是OK的,笔者这里使用的是列表的方式。
新建3个列表L1L2L3,分别用于存放:记录歌词时间、记录歌词内容和记录时间差,把文档内容切片存储到L1和L2之后,再把计算出来的时间差存到L3中,最后只要按照时间差用for循环打印出歌词就行了
本文属于新手的练习题,比起网络上那些乱七八糟的数学题做起来有意思的多,在编写的过程中会遇到很多很多奇葩的问题,在解决问题的过程中自己慢慢摸索,当你看到打印出歌词的那一刻,心里会有莫大的成就感。当然,把这个写完之后可以在这个基础上做一些扩展:
1. 从网络上获取歌词进行打印
2. 写一个gui,让歌词在gui上显示
3. 做一个播放器,链接网上的歌曲和歌词,变成一个自己的播放器
最后的最后,放上源码。
#coding:utf-8
import time
#把字符创时间换算成微秒
def changenum(shijian):
return float(shijian[0:2]) * 60 * 100000 + float(shijian[3:5]) * 100000 + float(shijian[6:])*100
list1 = [] #记录歌词时间
list2 = [] #记录歌词内容
list3 = [] #记录每句歌词的时间差
myFile = open("guanghuisuiyue.txt")
#把歌词中的时间和歌词内容分别插入两个列表
for x in myFile:
if x.strip():
list1.append(x[1:9])
list2.append(x[10:])
#计算出时间差插入一个列表
for i in range(len(list1)-1):
list3.append(changenum(list1[i+1])-changenum(list1[i]))
#按时间差输出歌词
for j in range(len(list3)):
time.sleep(list3[j]/100000)
print list2[j]
print "end"
myFile.close()