如何在Python中从文件读取字节

8 投票
4 回答
8134 浏览
提问于 2025-04-11 09:34

这段内容和这个问题类似,我正在尝试读取一个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]

打印出任何值都不太好,因为它们的格式不正确。

4 个回答

2

我正在尝试读取一个ID3v2标签的头部信息。

顺便说一下,这里有一个现成的模块可以用来做这个。

4

为什么要自己写呢?(假设你还没有看看其他的选择。)其实有几个方法可以用Python读取MP3文件中的ID3标签信息。你可以看看我在这个问题上的回答

16

如果你有一个字符串,里面有2个字节,你想把它当作一个16位的整数来理解,可以这样做:

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

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

对于其他大小的整数,你需要使用不同的格式代码。比如,"i"表示一个带符号的32位整数。想了解更多,可以查看help(struct)的内容。

你还可以一次性解包多个元素。比如,解包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)

撰写回答