关闭

Python练手(一)

标签: python
644人阅读 评论(0) 收藏 举报
分类:

Python的一个习题

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

前提的前提:

  1. 你需要了解Python的基本语法,循环等知识
  2. 你需要了解Python对文件的读写

歌词动态显示:

  1. 打开百度,搜索光辉岁月(当然也可以是其他的歌词,前端开发那哥们很喜欢这首歌,就让我搜索了这首歌)
  2. 把歌词文件光辉岁月.lrc下载下来
  3. 把lrc文件中的文本贴到一个ghsy.txt的文本中(据说直接读取lrc文件也是可以的,我没有试过)
  4. 用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]是一生奉献 肤色斗争中

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


需要引用的模块

  1. OS模块。当然也不一定就一定要OS模块,你直接指定一个路径也是可以的(我就是这么懒,没有使用OS模块)
  2. 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()
2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:124558次
    • 积分:2138
    • 等级:
    • 排名:第17752名
    • 原创:83篇
    • 转载:3篇
    • 译文:6篇
    • 评论:101条
    友情链接
    文章分类
    最新评论