用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键退出')
复制代码
不过感觉写得太长了,像这样一个脚本好像几十行就能解决,
求各路大神指点!!!
复制代码
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键退出')
复制代码
相关文章推荐
- 在CuteEditor中如何让用户来管理自己的文件夹
- python一键分类文件夹下的文件音乐
- python 删除文件及文件夹下的文件夹脚本(自己加个定时修改个路径ok)
- python的模块管理与发布+如何在pypi上发布自己的模块
- python 模块化管理,导入自己的模块(包)
- 如何管理自己的文件夹
- 在CuteEditor中如何让用户来管理自己的文件夹
- 用Python实现自己下载音乐的统计
- python 遍历文件夹和子目录抓出自己想用的文件类型
- 远程拷贝文件及文件夹+python导入自己的模块 笔记
- 在python包管理中使用easy_install软件的步骤
- Python自己实现迭代器
- python文件夹遍历,文件操作,获取文件修改创建时间<转>
- 自己写的java递归删除文件及文件夹
- 如何用python过滤显示文件或者文件夹
- 使用GIT管理自己的源代码图文教程
- Python ——名片管理系统(增添,删除,查找,修改)
- iOS 音频指南:如何称职的管理自己的音频系统
- Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
- 一些关于Python的基础知识 - 千月的python linux 系统管理指南学习笔记(3)