• 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()
  • 相关阅读:
    RRC Server安装配置过程
    开园啦~
    VB.NET 初涉线程的定义和调用
    使用 VB.NET 开发多线程
    多线程 与 单线程 的区别
    Marshal 类的内存操作的一般功能
    VB.NET 内存指针和非托管内存的应用
    OpenProcess() 函数
    DataTable与结构不同实体类之间的转换
    C#的同步和异步调用方法
  • 原文地址:https://www.cnblogs.com/cocoa-cq/p/9406302.html
Copyright © 2020-2023  润新知