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()
相关文章推荐
- python笔记
- Python聚类算法之凝聚层次聚类实例分析
- Python 私有属性与内部方法
- python CGI 文件读写注意 500
- selenium webdriver python 环境搭建
- 文章标题
- python 3.x 163邮箱登陆,邮件读取
- 每天一点——python map()和reduce()
- Python聚类算法之基本K均值实例详解
- Python实现将xml导入至excel
- 基本线性回归、局部加权线性回归和缩减方法(岭回归、前向逐步回归) in Python
- Python文件操作之简化代码
- python的循环,pass和DocString
- 每天一点python —— yield
- python logging模块的多文件应用
- windows下安装Python以及numpy、scipy、scitik-learn模块(3.4版本)
- python字典中没有输入的键key 返回一定的错误信息或者提示状态
- Python 字符串操作方法大全
- 每天一点python —— 迭代器与生成器
- ipythonnotebook + spark