1. 程式人生 > >Python 運用所學知識製作一個歌詞解析器,要求:輸入時間給出對應歌詞

Python 運用所學知識製作一個歌詞解析器,要求:輸入時間給出對應歌詞

學了將近兩週python了,遇到了一道挺有意思的題分享一下:

     製作一個歌詞解析器,要求:輸入一個時間點能給出對應時間的歌詞

廢話不多說,直接上圖,基本每步都有註釋:

mulrc = '''[ti:藍蓮花]
[ar:許巍]
[al:留聲十年絕版青春北京演唱會]
[00:-01.70]藍蓮花
[00:-00.70]演唱:許巍
[00:00.00]
[00:00.70]沒有什麼能夠阻擋
[00:06.01]你對自由的嚮往
[00:11.43]天馬行空的生涯
[00:16.99]你的心了無牽掛
[00:21.20]
[02:11.55][01:50.60][00:22.63]穿過幽暗的歲月
[02:16.93][01:55.60][00:27.81]也曾感到彷徨
[02:22.21][02:01.09][00:33.13]當你低頭的瞬間
[02:27.62][02:06.33][00:38.32]才發覺腳下的路
[02:31.64][02:10.23][00:42.37]
[02:32.97][00:43.79]心中那自由的世界
[02:38.23][00:49.50]如此的清澈高遠
[02:43.30][00:54.31]盛開著永不凋零
[02:47.70][00:58.50]藍蓮花
[02:53.95][03:00.06][01:05.41]'''
mulrc1 = mulrc.splitlines()
mulrc_time = {}                                             #設個字典儲存歌詞時間資訊
song_info = {}                                              #設一個儲存歌曲資訊的字典
#print(mulrc)
for i in mulrc1:                                            #遍歷出每行的元素
    if i[1].isdecimal():                                    #判斷是否是歌詞和時間,歌曲資訊放在else中
        l = i.split(']')                                    #按]分割,最後索引位置的就是歌詞
        lrc_list = l[-1]                                    #提取歌詞資訊
        time_list1 = l[0:-1]
        for time1 in time_list1:                            #遍歷出帶有[的時間資訊
            time_all = time1[1:]                            #去掉[
            time = time_all.split(':')                      #去掉:
            time_list = float(time[0]) * 60 + float(time[1])#將時間轉化為以秒為單位的
            mulrc_time[time_list] = lrc_list                #以歌曲時間為鍵,以歌詞為值,新增到準備的字典中
    #接下來整理歌曲資訊
    else:
        info = i[1:-1]                                      #去掉兩邊的中括號
        #print(info)                                        #這個是自己加的,在每句後面新增可以檢視前面的程式碼是否錯誤
        info = info.split(":")
        if info[0] == 'ti':                                 #整理一下歌曲資訊,將標題,作者,專輯分別賦好值新增到準備的字典中
            song_info['標題'] = info[1]
        elif info[0] == 'ar':
            song_info['作者'] = info[1]
        elif info[0] == 'al':
            song_info['專輯'] = info[1]

    #接下來就是測試是否可以按照時間顯示歌詞了
info_time = list(mulrc_time)                    #去除之前字典裡的時間資訊
info_time.sort(reverse=True)                    #若要想在下句歌詞之前一直顯示歌詞,就要給出大於引數時間的裡面的最小值,
#print(info_time)                               #遍歷中上一個元素找不了,為了方便,這裡講時間列表逆序排列,第一個大於時間引數的就是我們需要時間點
def lrc_by_time(xtime):
    for m in info_time:
        if m <= xtime:
            xtime = m
            break
    #print(xtime)
    return mulrc_time[xtime]

print(lrc_by_time(10))

如果想要讓歌詞進行滾動的話,按照現在本人的能力高階的操作秀不出來,只能整點小動作嘗試一下:

    這個可以在寫測試程式碼的時候動一下手腳,

import time
import os
t = 0
last_lrc = None
while True:
    lrc = lrc_by_time(t)                #得到對應時間的歌詞
    if last_lrc != lrc:                 #判斷是否和上句歌詞一樣
        # 清除原來的顯示
        os.system('cls')
        last_lrc = lrc
        for s in song_info:             #遍歷出歌曲資訊
            print(s, song_info[s])      #列印歌曲資訊
        print(lrc)
    t += 0.5
    time.sleep(0.5)

這樣寫在run裡面執行的看不出效果,,在終端裡面效果能夠顯示出來,這個一開始小白我也不會做,後來被教了之後自己有敲了好幾遍,現在終於能夠自己寫出來了,程式設計之路,沒有捷徑!!!