用python管理自己的音乐文件夹
这是一个用python3 和 mutagen库编写用来管理自己音乐文件夹的脚本。学习python挺久了,终于能写个有点用的东西了。源代码入下:
不过感觉写得太长了,像这样一个脚本好像几十行就能解决,
求各路大神指点!!!
1 import os 2 from mutagen.mp3 import MP3 3 import mutagen.id3 4 from mutagen.easyid3 import EasyID3 5 global illegel_letter 6 illegel_letter = (‘\\‘, ‘/‘, ‘:‘, ‘*‘, ‘?‘, ‘<‘, ‘>‘, ‘|‘) 7 8 9 def hello(): 10 print(‘-‘ * 74) 11 s = ‘‘‘ 12 ##################################################################### 13 # 这个脚本是用来整理你的音乐文件夹的,它可以将你的音乐 # 14 # 按照"歌手\专辑\歌曲"的形式整理到各自的文件夹中 # 15 # # 16 #--- ---- ---- ---- ---- ---- ---- ---- ----# 17 # **注:程序只处理MP3文件, 其他忽略** # 18 ##################################################################### 19 ‘‘‘ 20 print(s) 21 print(‘-‘ * 74) 22 d = ‘‘‘ 23 输入 s 开始整理; 输入 q 退出 24 ‘‘‘ 25 print(d) 26 27 28 def is_mp3(mp3): 29 ‘‘‘判断是否为MP3文件 30 ‘‘‘ 31 m = mp3.split(‘.‘) 32 if m[-1] == ‘mp3‘: 33 return True 34 else: 35 return False 36 37 38 def get_album(id3info): 39 ‘‘‘获取MP3的专辑信息 40 ‘‘‘ 41 if ‘album‘ not in id3info: 42 album = ‘unknown album‘ 43 else: 44 album = id3info[‘album‘][0] 45 return album 46 47 48 def get_artist(id3info): 49 ‘‘‘获取MP3文件的歌手信息 50 ‘‘‘ 51 if ‘artist‘ not in id3info: 52 artist = ‘unknown artist‘ 53 else: 54 artist = id3info[‘artist‘][0] 55 return artist 56 57 58 def check_name(filename): 59 ‘‘‘检查文件夹的名字是否合法 60 Check if directory is legal 61 ‘‘‘ 62 s = ‘‘ 63 64 # 去除文件名结尾的‘.‘ 65 length = len(filename) 66 while filename[length-1] == ‘.‘: 67 length = length - 1 68 69 # 除去文件名中非法字符 70 for i in range(length): 71 if filename[i] not in illegel_letter: 72 s += filename[i] 73 return s 74 75 76 def get_music_dirc(): 77 s = ‘‘‘ 78 请输在下面输入你的音乐文件夹的位置 79 例如 :(不区分大小写) 80 E:\\Users\\Music 81 C:\\SomeWhere\\MyMusicFile 82 D:\\kuwodownload 83 ‘‘‘ 84 print(s) 85 86 T = 1 87 while T: 88 music_dir = input(‘音乐文件夹所在位置:>>> ‘) 89 if os.path.isdir(music_dir): 90 return music_dir 91 T = 0 92 else: 93 print(‘你输入的路径不存在,请重新输入‘) 94 return music_dir 95 96 97 def clear_empty(music_dir): 98 print(‘***开始清理空文件夹***‘) 99 100 # 重新扫描路径 101 results = os.walk(music_dir) 102 103 # 如果为空文件夹则删除 104 for root, dirc, filename in results: 105 if (len(dirc)==0) & (len(filename)==0): 106 try: 107 os.rmdir(root) 108 print(‘已清除>>> %s‘ %root ) 109 except: 110 print(‘T_T 未能清除空文件夹‘) 111 return 112 print(‘*** CLEAR OK ***‘) 113 print(‘\n‘) 114 115 116 def echo_list(u=[]): 117 ‘‘‘输出列表中的每一项 118 ‘‘‘ 119 print(‘*** start ***‘) 120 for i in range(len(u)): 121 for j in range(len(u[i])): 122 print(u[i][j]) 123 print(‘-‘ * 70) 124 125 126 def echo_info(h): 127 ‘‘‘通过询问用户意愿输出详细信息 128 ‘‘‘ 129 print(‘是否逐条查看详细信息? <输入 y 查看, 输入 n 过>‘) 130 131 T = 1 132 while T: 133 YesOrNo = input(‘y / n ?>>> ‘) 134 if YesOrNo == ‘y‘: 135 for j in range(len(h)): 136 print(‘%s info:‘ % h[j]) 137 echo_list(u[j]) 138 print(‘\n‘) 139 140 T = 0 141 elif YesOrNo == ‘n‘: 142 print(‘未查看详细信息‘) 143 T = 0 144 else: 145 print(‘有效命令为:y / n‘) 146 147 148 def change_dirc(src, dst): 149 ‘‘‘把文件从 源路径(src) 移动到 目标路径(dst) 150 ‘‘‘ 151 152 # 拆分路径和文件名 153 split_src = os.path.split(src)[0] 154 name = os.path.split(src)[-1] 155 156 # 如果两路径相同则输出“位置正确” 157 if src == dst: 158 k = os.path.split(dst) 159 return ‘未移动文件: ‘, (k[-1], k[0]) 160 161 # 如果源路径和目标路径不同, 则进行如下操作 162 else: 163 try: 164 os.rename(src, dst) 165 return ‘已移动文件: ‘, (src, dst) 166 except FileExistsError as e: 167 return ‘重复文件: ‘, (src, dst) 168 169 170 def start(results): 171 172 # 声明变量 173 # 用来统计MP3文件数量和保存处理时的信息 174 __total__ = 0 175 SameFile = [] 176 MovedFile = [] 177 UnMovedFile = [] 178 179 # 处理这个目录下的每个文件 180 for root, dirc, files in results: 181 182 # 对每个文件: 183 for filename in files: 184 185 # 如果是MP3文件,则: 186 if is_mp3(filename): 187 188 # 获取这个MP3文件的当前路径 189 m_dirc = os.path.join(root, filename) 190 191 # 获取MP3文件的 id3 信息 192 id3info = MP3(m_dirc, ID3=EasyID3) 193 194 # 从 id3 信息中取得歌手和专辑,并检查是否为合法文件名 195 artist = check_name(get_artist(id3info)) 196 album = check_name(get_album(id3info)) 197 198 # 目标文件路径 199 new_dirc = os.path.join(music_dir, artist, album, filename) 200 201 # 改变文件路劲 202 h, r = change_dirc(m_dirc, new_dirc) 203 if h == ‘未移动文件: ‘: 204 UnMovedFile.append(r) 205 elif h == ‘已移动文件: ‘: 206 MovedFile.append(r) 207 else: 208 SameFile.append(r) 209 210 # 统计MP3文件数目 211 __total__ = __total__ + 1 212 213 print(‘-- mission completed --‘) 214 print("total: %d of songs" % __total__) 215 return [‘同名‘, ‘已移动‘, ‘未移动‘], [SameFile, MovedFile,UnMovedFile] 216 217 218 if __name__ == ‘__main__‘: 219 220 __author__ = ‘ven‘ 221 222 # 输出欢迎信息及提示 223 hello() 224 225 # 主循环 226 T = 1 227 while T: 228 user_input = input(‘s / q ?>>> ‘) 229 230 if user_input == ‘s‘: 231 music_dir = get_music_dirc() 232 233 # 遍历用户给出的目录 234 try: 235 results = os.walk(music_dir) 236 print(‘:) 成功遍历当前目录‘) 237 except: 238 print(‘:( 未能遍历当前目录‘) 239 240 # 处理每个MP3文件 241 h, u = start(results) 242 243 # 输出统计信息 244 print(‘\n‘) 245 for i in range(len(u)): 246 print(‘%s: %s‘ % (h[i], len(u[i]))) 247 print(‘-‘ * 70) 248 249 # 输出详细信息 250 print(‘\n‘) 251 echo_info(h) 252 253 # 清楚空文件夹 254 print(‘\n‘) 255 clear_empty(music_dir) 256 257 T = 0 258 elif user_input == ‘q‘: 259 T = 0 260 else: 261 print(‘未知指令,请重新输入‘) 262 263 input(‘现在任务已经完成了,按Enter键退出‘)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。