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()
python 将歌词解析封装成类,要求:提供一个方法(根据时间返回歌词) - 提示:封装两个类:歌词类、歌词管理类的更多相关文章
- 把jQuery的类、插件封装成seajs的模块的方法
这篇文章主要介绍了把jQuery的类.插件封装成seajs的模块的方法,需要的朋友可以参考下 注:本文使用的seajs版本是2.1.1 一.把Jquery封装成seajs的模块 define(func ...
- java—将查询的结果封装成List<Map>与用回调函数实现数据的动态封装(44)
手工的开始QueryRunner类.实现数据封装: MapListHandler MapHandler BeanListHandler BeanHandler 第一步:基本的封装测试 写一个类,Que ...
- 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法
参考原贴地址:https://blog.csdn.net/clementad/article/details/47339519 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Trans ...
- 【转】在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法
参考 原文链接 @Transactional does not work on method level 描述 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational) ...
- 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?
判断是否是同一人的方法——equals() 不能直接用per1==per2,这不是对象内容的比较而是存放对象地址的值得比较 在Person类中提供一个比较的方法compare()返回boolean值 ...
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...
- Hibernate的多表查询,分装到一个新的实体类中的一个方法
不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...
- 把HTML5网页封装成APP,APK的方法
phonegap appcan HBuilder的native.js 推荐你用两个东西打包 一个是ionic,一个是hbuilder,Maven,apicloud http://mobi ...
- 28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。 (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性, 和计算体积的方法。 (3)编写一个测试类,对以上两个类进行测试,创建一个长方体,定义其长、 宽、高,输出其底面积和体积。
//矩形父类 package d922A; public class Rect { private double l,w; Rect(double c,double k) { l=c; w=k; } ...
随机推荐
- C# Array类的Sort()方法
Array类实现了数组中元素的冒泡排序.Sort()方法要求数组中的元素实现IComparable接口.如System.Int32 和System.String实现了IComparable接口,所以下 ...
- 7、ORM
CRUD(create.retrieve.update.delete) left join right join inner join one2one one2many many2many 1.For ...
- Android 通过触摸动态地在屏幕上画矩形
需求概述: 在屏幕上用手指画出一个区域,返回所圈的区域坐标. 技术实现: 自定义View,设置画笔及对应参数,在onTouchEvent()回调函数里,对触摸事件进行判断.画出矩形图形. 代码: 自定 ...
- CentOS使用PXE网络启动自动安装操作系统
PXE工作原理简介 PXE (Preboot Excution Environment) 预启动执行环境 工作环境介绍: 要实现PXE自动网络安装CentOS至少需要两台主机 1)PXE服务器PXE ...
- August 23rd 2017 Week 34th Wednesday
Do not pray for easy lives. Pray to be stronger men. 不要祈祷舒适的生活,而是祈祷自己能变得更强大. It seems this quotation ...
- There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661) - skipping
Could not fetch URL https://pypi.python.org/simple/xlrd/: There was a problem confirming the ssl cer ...
- C#互操作
一.引言 “为什么我们需要掌握互操作技术的呢?” 对于这个问题的解释就是——掌握了.NET平台下的互操作性技术可以帮助我们在.NET中调用非托管的dll和COM组件. ..NET 平台下提供了3种互操 ...
- facebook开源的代码审核工具phabricator
主页地址:http://phabricator.org/
- Java对文件的读取方式以及它们的优缺点
Java常用的对文件的读取方式基本包括: BufferedReader -> readLine(): 按行读取文件,直到读取内容==null FileInputStream -> read ...
- python BaseManager中register()的描述
register(typeid[, callable[, proxytype[, exposed[, method_to_typeid[, create_method]]]]]) A classmet ...