本文實例講述了Python修改MP3文件的方法。分享給大家供大家參考。具體如下:
用這個程序修改后的MP3比原來要小一些了,因為一張圖片被刪除了,起到了給MP3"瘦身"的作用。在一些mp3中,每個都有一張400多K的圖片,10幾個MP3,就相當一個普通MP3文件的大小了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# -*- coding: cp936 -*- """ 將MP3文件中的ID3V2.3部分去掉,以便在MP3機上播放 用法:mp3lcear [源mp3目錄] [生成的mp3目錄] """ import sys import os import string import shutil import struct import thread import threading import time mp3suffix = 'mp3' class Process(threading.Thread): """ 簡單地在運行的過程中顯示進度 """ def __init__( self ,msg,sleepTime): threading.Thread.__init__( self ) self .msg = msg self .running = True self .sleepTime = sleepTime def setPause( self ,pause): self .pause = pause def setRunning( self ,running): self .running = running def run ( self ): while ( self .running): self .pause.wait() print self .msg, time.sleep( self .sleepTime) def usage(code, msg = ''): """ 程序的使用方法 """ print >> sys.stderr, __doc__ if msg: print >> sys.stderr, msg sys.exit(code) def checkDir(argDir,create = False ): """ 檢查目錄是否存在,如果create為Ture,則新建一個目錄 """ tempDir = None if ( not os.path.isdir(argDir)): currentDir = os.path.abspath(os.curdir) tempDir = os.path.join(currentDir,argDir) if ( not os.path.isdir(tempDir) and create): os.mkdir(tempDir) else : usage( 1 , "目錄" + argDir + "不存在" ) else : tempDir = os.path.abspath(argDir) return tempDir def clearMp3(srcFile,destFile): """ 修改mp3文件,并將其創建到destFile所指定的地址 """ global process srcfp = None filesize = os.path.getsize(srcFile) try : srcfp = open (srcFile, 'rb' ) head = srcfp.read( 3 ) if (head = = 'ID3' ): srcfp.seek( 3 , 1 ) size = srcfp.read( 4 ) if ( not len (size) = = 4 ): print srcFile + '文件格式錯誤' else : size0 = struct.unpack( 'b' ,size[ 0 ])[ 0 ] size1 = struct.unpack( 'b' ,size[ 1 ])[ 0 ] size2 = struct.unpack( 'b' ,size[ 2 ])[ 0 ] size3 = struct.unpack( 'b' ,size[ 3 ])[ 0 ] headSize = (((size0& 0x7f )<< 21 ) | ((size1& 0x7f )<< 14 ) | ((size2& 0x7f )<< 7 ) | (size3& 0x7f )) filesize = filesize - headSize destfp = None try : dataLen = 0 destfp = open (destFile, 'wb' ) srcfp.seek(headSize, 1 ) data = srcfp.read( 1024 ) while (data! = ''): destfp.write(data) data = srcfp.read( 1024 ) except Exception,e: print '創建文件' + destFile + '錯誤' ,e try : if (destfp ! = None ): destfp.close except Exception,de: print de else : print srcFile + '不需要修改 拷貝' , try : shutil.copyfile(srcFile,destFile) except Exception, ce: print ce except Exception,oe: print '修改中出錯' ,oe try : if (srcfp ! = None ): srcfp.close() except Exception,se: print de if __name__ = = "__main__" : if ( len (sys.argv)< 3 ): usage( 1 ) global process sourceDir = checkDir(sys.argv[ 1 ]) destDir = checkDir(sys.argv[ 2 ], True ) print 'Mp3源目錄' ,sourceDir print 'Mp3目的目錄' ,destDir process = Process( '...' , 1 ) pause = threading.Event() process.setPause(pause) process.start() for filename in os.listdir(sourceDir): srcPath = os.path.join(sourceDir, filename) destPath = os.path.join(destDir, filename) if os.path.isfile(srcPath): print '開始處理 ' + filename, tempfilename = filename.lower() if ( not tempfilename.endswith(mp3suffix)): print filename + '不是一個mp3文件\n' else : pause. set () clearMp3(srcPath,destPath) pause.clear() print '結束 \n' pause. set () process.running = False sys.exit( 0 ) |
希望本文所述對大家的Python程序設計有所幫助。