【问题标题】:How Does One Read Bytes from File in Python如何在 Python 中从文件中读取字节
【发布时间】:2010-09-14 02:42:01
【问题描述】:

类似于this 问题,我正在尝试读取 ID3v2 标记标头,但无法弄清楚如何在 python 中获取单个字节。

我首先将所有十个字节读入一个字符串。然后我想解析出各个信息。

我可以获取字符串中的两个版本号字符,但是我不知道如何获取这两个字符并从中获取一个整数。

struct 包似乎是我想要的,但我无法让它工作。

到目前为止,这是我的代码(顺便说一句,我对 python 很陌生……所以请放轻松):

def __init__(self, ten_byte_string):
        self.whole_string = ten_byte_string
        self.file_identifier = self.whole_string[:3]
        self.major_version = struct.pack('x', self.whole_string[3:4]) #this 
        self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
        self.flags = self.whole_string[5:6]
        self.len = self.whole_string[6:10]

打印出任何值显然是废话,因为它们的格式不正确。

【问题讨论】:

    标签: python id3


    【解决方案1】:

    如果您有一个包含 2 个字节的字符串,您希望将其解释为 16 位整数,您可以这样做:

    >>> s = '\0\x02'
    >>> struct.unpack('>H', s)
    (2,)
    

    请注意,> 用于大端(整数的最大部分在前)。这是 id3 标签使用的格式。

    对于其他大小的整数,您使用不同的格式代码。例如。 "i" 表示带符号的 32 位整数。有关详细信息,请参阅帮助(结构)。

    您也可以一次解压多个元素。例如,对于 2 个无符号短裤,后跟一个有符号的 32 位值:

    >>> a,b,c = struct.unpack('>HHi', some_string)
    

    按照您的代码,您正在寻找(按顺序):

    • 3 个字符的字符串
    • 2 个单字节值(主要和次要版本)
    • 一个 1 字节的标志变量
    • 一个 32 位长度的量

    这个格式字符串是:

    ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
    

    【讨论】:

      【解决方案2】:

      为什么要自己写? (假设您尚未检查这些其他选项。)有几个选项可用于从 Python 中的 MP3 中读取 ID3 标签信息。在this 问题上查看我的answer

      【讨论】:

      • 我确实看到了他们。但这实际上是针对学校的一个项目,我们决定编写自己的解析器。
      【解决方案3】:

      我正在尝试读取 ID3v2 标记标题

      FWIW,这里有 already a module

      【讨论】:

        【解决方案4】:

        我打算推荐struct 包,但你说你已经尝试过了。试试这个:

        self.major_version = struct.unpack('H', self.whole_string[3:5])
        

        pack() 函数将 Python 数据类型转换为位,unpack() 函数将位转换为 Python 数据类型。

        【讨论】:

        • 对于“H”,您需要使用 2 字节切片。
        • 你说得对,我忽略了这一点。我将修复我的示例,使其正常工作,但无论如何你的答案是更好的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多