您的位置:首页 > 编程语言 > Python开发

用python管理自己的音乐文件夹

2015-05-09 23:43 176 查看
这是一个用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],
9996
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键退出')

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: