本文实例讲述了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程序设计有所帮助。