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

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