用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键退出)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。