美文网首页
day-18 音乐歌词打印(按时间点打印)

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

作者: RurouniKenshin | 来源:发表于2018-08-02 21:00 被阅读207次
    """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

    相关文章

      网友评论

          本文标题:day-18 音乐歌词打印(按时间点打印)

          本文链接:https://www.haomeiwen.com/subject/ljzsvftx.html