用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键退出')
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值