如何在Python中读取二进制MP3文件中的特定字节?

问题描述:

我会学会处理读取和写入二进制数据。我知道,我可以打开一个二进制文件与如何在Python中读取二进制MP3文件中的特定字节?

f = open(myfile, mode='rb') 
fb = f.read() 
f.close() 
return fb 

我如何与这种结构访问和读取$ A7- $ AC范围内的MP3文件: Lame mp3 Tags

你应该看看Python的struct库,用于提取二进制数据。

import struct 

mp3_filename = r"my_mp3_file.mp3" 

with open(mp3_filename, 'rb') as f_mp3: 
    mp3 = f_mp3.read() 
    entry = mp3[0xA7:0xAC+1] 
    print struct.unpack("{}b".format(len(entry)), entry) 

这将使你的整数,如清单:

(49, 0, 57, 0, 57, 0)   

你传递一个格式字符串来告诉Python如何解读为此每个字节。在这个例子中,它们都是简单地从字节转换成整数。每个格式说明符都可以有重复计数,所以对于您的示例,格式字符串将是"6b"。如果您想将其解码为单词,则只需更改格式说明符即可,还有一整套选项可以帮助您:Struct format characters

要将它们转换为零,您需要关闭文件并重新打开写作。建立一个新的输出如下:

import struct 

mp3_filename = r"my_mp3_file.mp3" 
zeros = "\0\0\0\0\0\0" 

with open(mp3_filename, 'rb') as f_mp3: 
    mp3 = f_mp3.read() 
    entry = mp3[0xA7:0xAC+1] 
    print struct.unpack("{}B".format(len(entry)), entry) 

    if entry != zeros: 
     print "non zero" 

with open(mp3_filename, 'wb') as f_mp3: 
    f_mp3.write(mp3[:0xA7] + zeros + mp3[0xAD:]) 

供参考:有现成的Python库,能够从MP3文件中提取标签信息。看看类似id3reader包。

+0

非常感谢。由此产生的整数对我来说是完美的。我只希望检查是否不存在0.但是,如何将这些字节替换为例如零并将其写回文件? – xpilgrim

+0

恕我直言,id3reader包不适合这个,而这些是来自lame标签,而不是id3标签的字段。 – xpilgrim

+0

您将需要以二进制写入模式重新打开mp3文件,并用零替换该部分。我已经更新了答案。 –