设为首页 收藏本站
查看: 642|回复: 0

[经验分享] 用python管理自己的音乐文件夹

[复制链接]

尚未签到

发表于 2015-11-29 11:33:47 | 显示全部楼层 |阅读模式
  这是一个用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 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     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)):
122                 print(u[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, 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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144875-1-1.html 上篇帖子: 将Python脚本打包成可执行文件 下篇帖子: Python 装饰器学习以及实际使用场景实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表