歌词解析器
代碼實現的功能
通過查看兩段歌詞出現的時間,來計算出相應的間隔時間,并按著間隔時間來展示歌詞(大白話,就是唱到這句歌詞時,這句歌詞登場了)
代碼實現步驟
代碼展示
"""問題:前后對tmp_data歌詞進行操作,會不會有影響 """class MusicLrc(object):def __init__(self,path='LRC.MD',code = 'gbk'):data = []with open(path,'r',encoding = code) as r:#[# '[00:00.78]Something Just Like This - The Chainsmokers/Coldplay\n',# '[00:03.91]I've been reading books of old\n'# ...#]tmp_data = r.readlines()#將歌詞按照時間進行展開 #加入:::區分時間和歌詞內容tmp_data = [y.strip()[1:]+':::'+x.split(']')[-1]for x in tmp_datafor y in x.split(']')[:-1]]tmp_data.sort()#將歌詞按照時間進行排序,根據前面的時分秒進行排序data = [x.split(':::') for x in tmp_data] #計算每一句歌詞的存在時間for i in range(len(data)-1): # 只需要計算倒數第二個歌詞的時間即可tmp = data[i][0].split(':')start = int(tmp[0])*60 + float(tmp[1])#拆分后計算開始時間tmp = data[i+1][0].split(':')end = int(tmp[0])*60 + float(tmp[1])data[i].insert(1,end - start) #計算當前歌詞的存在時間data[-1].insert(1,0) #倒數第二句歌詞展示后,經過一段時間后展示最后歌詞,最后沒有歌詞要展示了self.data = datacq = MusicLrc('LRC.md') import time for x in cq.data:print('\r'+x[-1],end='')time.sleep(x[-2]) #按歌詞相隔時間來處理代碼分析:
r.readlines()就是一次讀入(所有的內容),分行處理,得到的結果為列表,每個元素是每一行的內容,如下所示:
[
‘[00:00.78]Something Just Like This - The Chainsmokers/Coldplay\n’,
‘[00:03.91]I’ve been reading books of old\n’,
…]
列表生成式中的雙層for循環從左往右執行
代碼細分
drizzle="[00:03.91]I've been reading books of old\n" damp=drizzle.split(']') # print(damp,type(damp)) # ['[00:03.91', "I've been reading books of old\n"] <class 'list'>damp=drizzle.split(']')[:-1] print(damp,type(damp)) # ['[00:03.91'] <class 'list'>frost=damp[0].strip()[1:] # 切片的神奇功能,原本是什么數據類型,切完后還是什么數據類型 print(frost,type(frost)) # 00:03.91 <class 'str'>,去除'['符號gale=drizzle.split(']')[-1] print(gale,type(gale)) # 'I've been reading books of old\n' <class 'str'>data = [x.split(':::') for x in tmp_data] print(data) # [['00:03.91', "I've been reading books of old\n"], # ['00:06.78', 'Something Just Like This - The Chainsmokers/Coldplay\n']]# 經過計算歌詞持續時間后的data [['00:03.91', 2.87, "I've been reading books of old\n"],['00:06.78', 0, 'Something Just Like This - The Chainsmokers/Coldplay\n']]# \r 相當于回車hurricane=drizzle.split(']')[0] print(hurricane,type(hurricane)) # ''[00:03.91' <class 'str'> for i in hurricane:# 每個i 為一個單獨的字符串,so 打印為len(hurricane)個空行print(i.strip()[1:])仍然存在的問題:
1.在進行列表推導式時,同時tmp_data,為什么不會破壞原來的序列
答:對,相同的變量名,但并不沖突,因為是先 生成列表生成式,然后將其賦值給temp_data(通過前后調用id()函數也可以知道兩者內存地址不同),覆蓋了原來的值
2.在列表推導式中為什么for y in x.split(’]’)[:-1]不能改成for y in x.split(’]’)[0]
答:
使用x.split(’]’)[0] 獲得的數據是字符串,接下來我們遍歷時會得到’[00:00.78’中的每個字符
使用x.split(’]’)[:-1]獲得的數據是列表,接下來我們遍歷時會得到’[00:00.78’一個整體
總結
- 上一篇: mediawiki mysql_Wind
- 下一篇: java客户端带证书访问服务端_客户端与