我目前正在尝试学习如何解析PPM文件。我在python解释器中执行了以下操作:
>>> x = open('file.ppm')
>>> x.readline()
'P6\n'
>>> x.readline()
'2 3\n'
>>> x.readline()
'255\n'
>>> x.readline()
'\n'
>>> x.readline()
'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01'
我理解PPM文件的基本结构。不过,我对最后一行最为好奇。包含像素颜色信息的字节编码。上面的文件应解析回
P6
2 3
255
10 23 52 82 3 215 30 181 101 33 45 205 40 68 92 111 76 1
通过使用struct.pack('B',x)
,我看到整数被打包到上面的字节编码中。但是,我不确定如何使用struct.unpack
撤消此过程。最重要的是,我不确定在哪里切断每个字节编码,因为它们都出现在同一行上,并且每个字节编码看起来都不一样(?)。
我还尝试通过struct.pack('I','\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01')
打包整行。我不明白为什么它不能直接将字节编码转换成整数。
如何使用struct.pack(...)
将字节编码解析为整数?此外,当这些值被打包/解包时会发生什么?
答案 0 :(得分:0)
前三个字符串未由struct.pack
打包。如果你想删除周围的空格,只需使用它们strip
或rstrip
。
>>> 'P6\n'
'P6\n'
>>> 'P6\n'.rstrip()
'P6'
最后一个字节:
>>> b = b'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01'
>>> struct.unpack('%dB' % len(b), b)
(23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1)
或使用bytearray
:(您可以在Python 3.x中使用bytes
);迭代bytearray
会产生int
s。
>>> list(bytearray(b))
[23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1]
注意正如Martijn Pieters评论的那样,当你处理二进制数据时,最好用二进制模式打开文件。
f = open('file.ppm', 'rb') # b: binary mode