1 说明

1.1 python的基础知识:枯燥,网上一大堆,对于新手来说,一片茫然。

1.2 主要讲:列表和字典及操作(切片和定位),列表如何转换字符串等。

1.3 本机:python3.8和微软vscode,亲测。

1.4 本机背景音乐:梦然的少年和歌词lrc。

1.5 部分代码和音乐来源网络(不明),本人进行整理和加工,仅供学习,如有侵权请告知,定会删除。

python高亮(用终端显示歌词的方法来实战学习python的基础知识)(1)

值得收藏

2 文件架构

python高亮(用终端显示歌词的方法来实战学习python的基础知识)(2)

3 歌词在py代码内的:

3.1 lrcter.py代码:

#考虑手机的可阅读性,注释全部单独一行 #---导出模块--- import time import pygame #---获得歌词字典函数--- def get_music_dict(musiclrc): """ :param(参数)是: musiclrc: 歌词字符串 :return: 时间与歌词对应的字典 """ # 创建一个空字典,用来装 时间(key) 和 歌词(value) dictmusic = {} # 按照行进行切割 把每一行变成列表的一个元素 listline1 = musiclrc.splitlines() # 把每一行元素遍历出来,准备切割 for i in listline1: # 以 ] 为切割符 listline2 = i.split("]") # 每一次遍历 把歌词元素(每一次遍历都是最后一个) 赋值给 value value = listline2[-1] for j in range(len(listline2)-1): # 遍历 listLine2 len(listLine2)-1 除去最后的非时间字符串(歌词) keymusic = listline2[j][1:] # [1:]从索引值为1开始取目的是除去 [ # [1:]从索引值为1开始取目的是除去 [ 如果有缩进的话 需要用strip()去除空格 方案二 # keymusic = listline2[j].strip()[1:] # 对遍历的的时间字符串以冒号进行切割 keytime = keymusic.split(":") # 计算出每个时间的总秒数 musictime = float(keytime[0])*60 float(keytime[1]) # 把时间赋值给字典中的 key key = musictime # 把value 赋值给对应的时间 key dictmusic[key] = value return dictmusic #---打印输出歌词函数--- def print_music_dict(dictmusic): """ :param(参数) dictmusic:时间与歌词对应的字典 """ # 创建空列表,把字典的key写进去 listmuscitime = [] for keys in dictmusic.keys(): listmuscitime.append(keys) # 默认对列表进行升序 listmuscitime.sort() time.sleep(listmuscitime[0]) for index in range(len(listmuscitime)): if index > 0: # 两段歌词之间的时间 time.sleep((listmuscitime[index]-listmuscitime[index-1])) # 对列表里面的key值下标遍历,进而用get取字典的value print(dictmusic.get(listmuscitime[index])) #---主函数--- def main(): musiclrc = ''' [00:00.00]少年 - 梦然 [00:01.62]词:梦然 [00:02.35]曲:梦然 [00:03.02]编曲:张亮 [00:03.87]制作人:张亮/徐阁 [00:05.43]和声编写:海青/梦然 [00:07.06]和声演唱:海青/梦然 [00:08.62]混音工程师:赵靖 [00:09.88]母带工程师:赵靖 [00:11.28]监制:梦然 [00:22.39]换种生活 [00:23.24]让自己变得快乐 [00:24.87]放弃执着 [00:25.78]天气就会变得不错 [00:27.54]每次走过 [00:28.79]都是一次收获 [00:30.20]还等什么 做对的选择 [00:32.94]过去的 [00:33.66]就让它过去吧 [00:35.58]别管那是一个玩笑还是谎话 [00:38.26]路在脚下 [00:39.44]其实并不复杂 [00:40.81]只要记得你是你呀 [00:43.56]Wu oh oh [00:53.83]Wu oh oh [01:03.91]我还是从前那个少年 [01:06.72]没有一丝丝改变 [01:09.33]时间只不过是考验 [01:12.01]种在心中信念丝毫未减 [01:15.59]眼前这个少年 [01:17.28]还是最初那张脸 [01:20.03]面前再多艰险不退却 [01:23.17]Say never never give up [01:25.10]Like a fighter [01:26.30]Wu oh oh [01:37.02]换种生活 [01:37.99]让自己变得快乐 [01:39.53]放弃执着 [01:40.44]天气就会变得不错 [01:42.19]每次走过 [01:43.40]都是一次收获 [01:44.73]还等什么 做对的选择 [01:47.48]过去的 [01:48.32]就让它过去吧 [01:50.20]别管那是一个玩笑还是谎话 [01:52.91]路在脚下 [01:54.05]其实并不复杂 [01:55.49]只要记得你是你呀 [02:08.99]Miya miya miya miya miya [02:13.36]Call me [02:13.99]Miya miya miya miya miya [02:18.55]我还是从前那个少年 [02:21.25]没有一丝丝改变 [02:23.88]时间只不过是考验 [02:26.71]种在心中信念丝毫未减 [02:30.24]眼前这个少年 [02:31.94]还是最初那张脸 [02:34.68]面前再多艰险不退却 [02:37.77]Say never never give up [02:39.65]Like a fighter [02:41.02]追逐生命里光临身边的每道光 [02:43.41]让世界因为你的存在变的闪亮 [02:46.06]其实你我他并没有什么不同 [02:48.70]只要你愿为希望画出一道想象 [02:51.53]成长的路上必然经历很多风雨 [02:54.15]相信自己终有属于你的盛举 [02:56.85]别因为磨难 停住你的脚步 [02:59.33]坚持住 就会拥有属于你的蓝图 [03:02.14]Wu oh oh [03:11.67]我还是从前那个少年 [03:14.57]没有一丝丝改变 [03:17.38]时间只不过是考验 [03:20.01]种在心中信念丝毫未减 [03:23.59]眼前这个少年 [03:25.29]还是最初那张脸 [03:28.06]面前再多艰险不退却 [03:31.27]Say never never give up [03:33.12]Like a fighter [03:33.76]我还是从前那个少年miya [03:38.43]我还是从前那个少年miya [03:43.78]我还是眼前这个少年miya [03:49.07]我还是从前那个少年miya''' pygame.mixer.init() # 初始化音频部分 #音乐文件和地址,可自定义 #path = r"/home/xgj/Desktop/pythonsn/sn.mp3" # 音频绝对地址 path = "/home/xgj/Desktop/pythonsn/sn.mp3" # 音频绝对地址 pygame.mixer.music.load(path) pygame.mixer.music.play() get_music_dict(musiclrc) dictmusic = get_music_dict(musiclrc) print_music_dict(dictmusic) #延迟300,否则挤在一起 time.sleep(300) if __name__ == '__main__': main()

3.2 以上有列表和字典的基础操作,逐个分析和品味。

3.3 细节:字符串的大段注释法:3个引号法(3个单引号or双引号,作用一样),因为省去了换行符\n。

3.4 这种操作,不符合人们的常规操作习惯,而且代码量变多了。

==========================

4 读取lrc或者txt的歌词文件的

4.1 lrcpy.py的代码:

import time import pygame def get_music_dict(musiclrc): dictmusic = {} listline1 = musiclrc.splitlines() for i in listline1: listline2 = i.split("]") value = listline2[-1] for j in range(len(listline2)-1): keymusic = listline2[j][1:] keytime = keymusic.split(":") musictime = float(keytime[0])*60 float(keytime[1]) key = musictime dictmusic[key] = value return dictmusic def print_music_dict(dictmusic): listmuscitime = [] for keys in dictmusic.keys(): listmuscitime.append(keys) listmuscitime.sort() time.sleep(listmuscitime[0]) for index in range(len(listmuscitime)): if index > 0: time.sleep((listmuscitime[index]-listmuscitime[index-1])) print(dictmusic.get(listmuscitime[index])) def main(): #---以上相同--- # 打开文件 #file = open("/home/xgj/Desktop/pythonsn/sn.txt", "r", encoding="utf-8") #一样的 file = open("/home/xgj/Desktop/pythonsn/sn.lrc", "r", encoding="utf-8") # 读取文件全部内容 lrc_list = file.readlines() #将列表转换为字符串 musiclrc=''.join(lrc_list) file.close() #---以下相同--- pygame.mixer.init() # 初始化音频部分 path = "/home/xgj/Desktop/pythonsn/sn.mp3" # 音频绝对地址 pygame.mixer.music.load(path) pygame.mixer.music.play() get_music_dict(musiclrc) dictmusic = get_music_dict(musiclrc) print_music_dict(dictmusic) time.sleep(300) if __name__ == '__main__': main()

4.2 为了突出重点,与代码3相同部分注释去掉。

4.3 采用读取lrc和txt文件,注意自己的目录和路径,可自定义。

4.4 这种还不是最好的文件操作,推荐with法,发现没有,更简洁,且无file.close()或者f.close();

因为上述代码中如果没有close,那么一直在内存中,占用大量内存。

4.5 读取lrc和txt文件是一样的。

#---以上相同--- # 打开文件 with open("/home/xgj/Desktop/pythonsn/sn.lrc","r") as f: lrc_list = f.readlines() #将列表转换为字符串,重点讲解 musiclrc=''.join(lrc_list) #---以下相同---

5 列表转换为字符串。

#将列表转换为字符串 ls1 = ['x', 10, 'y', 20] #发现列表1中有字符串,也有数字int #将列表1中的字符串和数字都转换为字符串,存入列表2中 ls2 = [str(i) for i in ls1] print(ls2) #得到 #['x', '10', 'y', '20'] #4个独立的字符串并未一个字符串,存入列表3中 ls3 = ''.join(ls2) print(ls3) #打印列表3,得到 #'x10y20'

为什么要这么做?因为在3.1 lrcter.py代码中musiclrc = '''xxx''',是作为一个字符串出现的。

自己整理出来的,分享给大家。

,