day-18 音乐歌词打印(按时间点打印)

2018-08-02  本文已影响207人  RurouniKenshin
"""new python"""
import re
import time


class Lyrics:
    """歌词显示"""
    @classmethod
    def show(cls, file):  # 静态方法,打印时间以及歌词
        ly_list = cls.ly_tuple_list(file)  # 获得歌词列表
        print('开始播放......')
        star_ly = 0  # 设置初始播放的开始时间
        star_time = time.clock()  # 歌词开始打印的开始时间
        for lytime_ly in ly_list:
            time.sleep(cls.get_time(lytime_ly[0]) - star_ly)  # 歌词打印的时间点
            print(lytime_ly[0], lytime_ly[1])  # 打印歌词
            star_ly = cls.get_time(lytime_ly[0])  # 为下一行歌词打印的时间点设置相对时间
        end_time = time.clock()  # 歌词打印完毕结束时间
        print('一首歌的时间:' + str(end_time - star_time) + ' s')  # 计算整首歌的时间

    @classmethod
    def ly_tuple_list(cls, file):  # 读取文件并转化数据的方法 txt数据-->[()]内元素为元组,外层列表容器
        with open(file, 'r', encoding='utf-8') as ly:
            context = ly.read()  # 读取文件
        new_str = re.sub('\n', ',', context)  # 转化为每一行由 逗号 分割的组合字符串
        list1 = new_str.split(',')  # 按 逗号 分割成字符串列表
        """
        以上两步可以用一步代替
        list1 = context.split('\n')
        """
        list_ly = [] # 初始化 元组歌词列表
        for key in list1:
            time_list = re.findall(r'\[(.+?)\]', key)  # 获取字符串中的多个时间并以他们为元素构成列表
            ly = re.sub('[0-9\!\%\[\]\,\。\:\.]', '', key)  # 获取字符串中的歌词
            for x in time_list:  # 遍历每一个时间列表
                list_ly.append((x, ly))  # 将时间和对应的歌词组合为2元组传入 元组歌词列表
        for i in range(len(list_ly)):  # 冒泡排序,按照元组中的时间先后进行排序
            for j in range(i, len(list_ly)):
                if cls.get_time(list_ly[i][0]) > cls.get_time(list_ly[j][0]):
                    list_ly[i], list_ly[j] = list_ly[j], list_ly[i]
        return list_ly  # 返回元组列表

    @staticmethod
    def get_time(key):  # 将歌词式时间转化为可判断大小的以s为单位的时间
        new_time = re.sub('[\:\.]', '', key)  # 清除符号
        result = new_time.lstrip('0')  # 清除多余的 0
        ms = int(result) % 100  # 秒的小数位
        s = int(result) // 100 % 100  # 秒的整数位
        m = int(result) // 10000  # 分的整数位
        return ms * 0.01 + s + m * 60  # 返回可判断大小的时间


if __name__ == '__main__':
    Lyrics.show('ly.txt')

# 结果
开始播放......
00:00.20 蓝莲花
00:00.80 没有什么能够阻挡
00:06.53 你对自由地向往
00:11.59 天马行空的生涯
00:16.53 你的心了无牵挂
00:21.95 穿过幽暗地岁月
00:26.83 也曾感到彷徨
00:32.30 当你低头地瞬间
00:37.16 才发觉脚下的路
00:42.69 心中那自由地世界
00:47.58 如此的清澈高远
00:52.72 盛开着永不凋零
00:57.47 蓝莲花
01:50.22 穿过幽暗地岁月
01:55.46 也曾感到彷徨
02:00.60 当你低头地瞬间
02:05.72 才发觉脚下的路
02:11.27 穿过幽暗地岁月
02:16.51 也曾感到彷徨
02:21.81 当你低头地瞬间
02:26.79 才发觉脚下的路
02:32.17 心中那自由地世界
02:37.20 如此的清澈高远
02:42.32 盛开着永不凋零
02:47.83 蓝莲花
一首歌的时间:167.85623402976904 s

思路型代码,对以下数据样式的文件(.txt)都有效(json的没写,要写就是改下读取文件的模式)
歌词文件:


image.png
上一篇下一篇

猜你喜欢

热点阅读