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''',是作為一個字符串出現的。
自己整理出來的,分享給大家。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!