标准midi文件使用什么样的编码?

时间:2014-08-15 09:28:43

标签: python encoding midi

标准midi文件使用什么样的编码?

这就是提出这个问题的原因:

with open(path + "/OneChance1.mid") as f:
for line in f.readline():
print(line)

这里我只是想读一个midi文件来搜索它的内容。然后我收到此错误消息:| UnicodeDecodeError:'charmap'编解码器无法解码153位的字节0x90:字符映射到|

如果我使用open()的第二个参数:open(path + "/OneChance1.mid"m encoding='utf-8) as f:,那么我收到此错误: UnicodeDecodeError:'utf-8'编解码器无法解码位置13中的字节0x80:无效的起始字节|

如果我将编码参数更改为ascii,我会收到另一个关于序数超出范围的错误。最后我尝试了utf-16,它说文件没有以BOM开头(这让我因某种原因而笑)。此外,如果我忽略错误,我会得到与我期望的数据类似的字符。我的期望是基于这个来源:http://www.sonicspot.com/guide/midifiles.html

无论如何,有谁知道midi文件使用什么样的编码?我的研究在这方面做得很短,所以我认为值得询问。或者也许有人可以指出其他一些可能性或错误?

谢谢你们。

2 个答案:

答案 0 :(得分:7)

MIDI文件是二进制内容。但是,通过将文件作为文本文件打开,Python会在尝试将文本解码为Unicode时应用默认的系统编码。

二进制模式打开文件:

with open(midifile, 'rb') as mfile:
    leader = mfile.read(4)
    if leader != b'MThd':
        raise ValueError('Not a MIDI file!')

如果您想从该文件中了解更多信息,则必须学习MIDI standard file format。另请参阅What is the structure of a MIDI file?

答案 1 :(得分:3)

它是一个二进制文件,它不是像您期望的那样使用文本编码的文本。

要在Python中以二进制模式打开文件,请将包含"b"的字符串作为第二个参数传递给open()

This page包含格式说明。