繁体   English   中英

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

[英]How Does One Read Bytes from File in Python

问题类似,我试图读取ID3v2标记头,并且无法弄清楚如何在python中获取单个字节。

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

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

结构包似乎是我想要的,但我不能让它工作。

这是我的代码到目前为止(我对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]

打印出任何值,除了明显废话,因为它们格式不正确。

如果您有一个字符串,您希望将其解释为16位整数,则可以通过以下方式执行此操作:

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

请注意,>适用于big-endian(整数的最大部分首先出现)。 这是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)

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

我打算推荐struct包,但后来你说你试过了。 试试这个:

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

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

我正在尝试读取ID3v2标记头

FWIW, 已经有了一个模块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM