您的位置:首页 > 编程语言 > Python开发

Python练手(一)

2015-11-20 11:22 555 查看

Python的一个习题

这段时间一直在学习Python,把基础语法看完之后,就像找一点小练习来测试一下学习的程度,但是网络上大部分的东西都是一些算术题,比如水仙花算法,杨辉三角等等问题,做起来没什么意思,旁边一个前端开发的哥们给我出了一个题,挺有意思的,发出来给大家看看,一起学习学习。

前提的前提:

你需要了解Python的基本语法,循环等知识

你需要了解Python对文件的读写

歌词动态显示:

打开百度,搜索光辉岁月(当然也可以是其他的歌词,前端开发那哥们很喜欢这首歌,就让我搜索了这首歌)

把歌词文件光辉岁月.lrc下载下来

把lrc文件中的文本贴到一个ghsy.txt的文本中(据说直接读取lrc文件也是可以的,我没有试过)

用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]是一生奉献 肤色斗争中

上面是歌词文件的格式,最关键的内容就是时间与歌词的剥离,简单来说就是我们要把每一句的时间取出来,按照时间的顺序做一个延迟,然后根据时间的延迟,把歌词一句一句打出来

需要引用的模块

OS模块。当然也不一定就一定要OS模块,你直接指定一个路径也是可以的(我就是这么懒,没有使用OS模块)

time模块。我们需要时间延迟,那必须要用到时间的模块

开工

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: