python 将歌词解析封装成类,要求:提供一个方法(根据时间返回歌词)

自己写的  有更好方案的大佬可以讨论一下





import bisect
class Lrc():
def __init__(self, sec, lrc):
self.sec = sec
self.lrc = lrc

def __str__(self):
return "时间{} 歌词{}".format(self.sec, self.lrc)

class Jiexi():
def __init__(self,file_path):
self.lrc_dict = {} #时间与歌词的键值对字典
self.lrc_second = [] #存放时间的列表
self.lrc_list = []#存放Lrc对象的列表
self.file_path = file_path
self.fenxi()

def fenxi(self):
with open(self.file_path, 'r', encoding='utf-8') as file_object:
while True:
string = file_object.readline().rstrip()
#print(string)
if string == "":
break
if string[1].isdecimal(): #去除前三行非歌词部分
lrc_list = string.split(']') #分割开时间与歌词
lrc_info = lrc_list[-1] #获得歌词
time_info = lrc_list[:-1] #获得全部时间部分
for time_str in time_info: #遍历时间部分 获得全部时间
time_str = time_str[1:]
time_info_list = time_str.split(':')#得到分钟与秒数
time_min = float(time_info_list[0])
time_sec = float(time_info_list[1])
time = time_min * 60 + time_sec #将时间字符串格式化为小数
index = 1
lrc = "lrc" + str(index) #创建Lrc对象的对象名字
index += 1         #第一个循环Lrc对象名为lrc1第二次循环对象名为lrc2以此类推
lrc = Lrc(time,lrc_info) #创建Krc对象 传进去时间参数以及歌词参数
self.lrc_list.append(lrc)
self.lrc_second.append(time)
self.lrc_dict[time] = lrc_info
return self.lrc_list

def get_lyric(self,lyric_time):
self.lrc_second.sort() #将存放时间的列表排序
lyric_te_lt = lyric_time.split(":") #分割你输入的时间
res_time = float(lyric_te_lt[0]) *60 + float(lyric_te_lt[1]) #格式化输入时间
res_position = bisect.bisect_left(self.lrc_second,res_time) #二分搜索模块得到结果时间的位置
return self.lrc_dict[self.lrc_second[res_position-1]] #位置减1即为坐标 通过字典获得歌词 返回

def main(): #测试
song = Jiexi("D:/pyworkpace/qfpython/11-day/songwrod.txt") #输入的路径以自己的为准
print(song.lrc_list[0])
print(song.get_lyric("02:10.00"))


if __name__ == '__main__':
main()
原文地址:https://www.cnblogs.com/cocoa-cq/p/9406302.html