Python 運用所學知識製作一個歌詞解析器,要求:輸入時間給出對應歌詞
阿新 • • 發佈:2018-12-06
學了將近兩週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裡面執行的看不出效果,,在終端裡面效果能夠顯示出來,這個一開始小白我也不會做,後來被教了之後自己有敲了好幾遍,現在終於能夠自己寫出來了,程式設計之路,沒有捷徑!!!