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

时间:2020-03-06 14:53:42  来源:igfitidea点击:

与此问题类似,我试图读取ID3v2标签标头,并且在弄清楚如何获取python中的单个字节时遇到麻烦。

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

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

struct包似乎是我想要的,但我无法使其正常工作。

到目前为止,这是我的代码(我对python btw还是很陌生……所以请放轻松):

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]

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

解决方案

我本来推荐struct包,但是我们说我们已经尝试过了。试试这个:

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

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

如果我们有一个字符串,并且希望将其解释为16位整数的2个字节,则可以通过以下方式实现:

>>> s = '
>>> a,b,c = struct.unpack('>HHi', some_string)
\x02' >>> struct.unpack('>H', s) (2,)

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

对于其他大小的整数,请使用不同的格式代码。例如。 " i"代表一个有符号的32位整数。有关详细信息,请参见help(struct)。

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

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

按照代码,我们正在寻找(按顺序):

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

格式字符串为:

I am trying to read in an ID3v2 tag header

为什么要自己写? (假设我们还没有签出这些其他选项。)这里有几个选项可用于从Python的MP3中读取ID3标签信息。在这个问题上查看我的答案。

##代码##

FWIW,已经有一个用于此的模块。