如何在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,已经有一个用于此的模块。