megnlingling 发表于 2015-11-29 11:33:47

用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']
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']
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 == '.':
67         length = length - 1      
68
69   # 除去文件名中非法字符
70   for i in range(length):
71         if filename not in illegel_letter:
72             s += filename
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   whileT:
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)):
122               print(u)
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)
137               echo_list(u)
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)
154   name = os.path.split(src)[-1]
155
156   # 如果两路径相同则输出“位置正确”
157   if src == dst:
158         k = os.path.split(dst)
159         return '未移动文件: ', (k[-1], k)
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 ['同名', '已移动', '未移动'],
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, len(u)))
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键退出')
  
页: [1]
查看完整版本: 用python管理自己的音乐文件夹