python歌词图表分析_用终端显示歌词的方法来实战学习python的基础知识

1 说明

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

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

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

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

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

值得收藏

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''',是作为一个字符串出现的。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值